novnc is updated to 1.0.0 and add console views: lite,full option
| 
						 | 
				
			
			@ -84,7 +84,7 @@
 | 
			
		|||
                      <li onclick='sendCtrlAltFN(11);'><a href='#'>Ctrl+Alt+F12</a></li>
 | 
			
		||||
                  </ul>
 | 
			
		||||
                </li>
 | 
			
		||||
                <li onclick='fullscreen()'><a href='#'>{% trans "Fullscreen" %}</a></li>
 | 
			
		||||
                <li id="fullscreen_button"><a href='#'>{% trans "Fullscreen" %}</a></li>
 | 
			
		||||
{% block navbarmenu %}{% endblock %}
 | 
			
		||||
            </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										242
									
								
								console/templates/console-spice-full.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,242 @@
 | 
			
		|||
<!--
 | 
			
		||||
   Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>
 | 
			
		||||
 | 
			
		||||
   This file is part of spice-html5.
 | 
			
		||||
 | 
			
		||||
   spice-html5 is free software: you can redistribute it and/or modify
 | 
			
		||||
   it under the terms of the GNU Lesser General Public License as published by
 | 
			
		||||
   the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
   (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
   spice-html5 is distributed in the hope that it will be useful,
 | 
			
		||||
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
   GNU Lesser General Public License for more details.
 | 
			
		||||
 | 
			
		||||
   You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
   along with spice-html5.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
   --------------------------------------------------
 | 
			
		||||
    Spice Javascript client template.
 | 
			
		||||
    Refer to main.js for more detailed information
 | 
			
		||||
   --------------------------------------------------
 | 
			
		||||
 | 
			
		||||
-->
 | 
			
		||||
{% extends "console-base.html" %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
{% load staticfiles %}
 | 
			
		||||
{% block head %}
 | 
			
		||||
 | 
			
		||||
        <title>WebVirtCloud - Spice Client - Full</title>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicearraybuffer.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/enums.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/atKeynames.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/utils.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/png.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/lz.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/quic.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/bitmap.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicedataview.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicetype.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicemsg.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/wire.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spiceconn.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/display.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/port.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/main.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/inputs.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/webm.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/playback.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/simulatecursor.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/cursor.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/jsbn.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/rsa.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/prng4.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/rng.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/sha1.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/ticket.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/resize.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/filexfer.js" %}"></script>
 | 
			
		||||
        <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
        <div id="login">
 | 
			
		||||
            <span class="logo">SPICE</span>
 | 
			
		||||
            <label for="host">Host:</label> <input type='text' id='host' value='{{ ws_host }}'> <!-- localhost -->
 | 
			
		||||
            <label for="port">Port:</label> <input type='text' id='port' value='{{ ws_port }}'>
 | 
			
		||||
            <label for="password">Password:</label> <input type='password' id='password' value='{{ console_passwd }}'>
 | 
			
		||||
            <label for="show_console">Show console </label><input type="checkbox" id="show_console" value="1" onchange="toggle_console()" checked>
 | 
			
		||||
            <button id="connectButton" onclick="connect();">Start</button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="spice-area">
 | 
			
		||||
            <div id="spice-screen" class="spice-screen"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="message-div" class="spice-message"></div>
 | 
			
		||||
 | 
			
		||||
        <div id="debug-div">
 | 
			
		||||
        <!-- If DUMPXXX is turned on, dumped images will go here -->
 | 
			
		||||
        </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block foot %}
 | 
			
		||||
 | 
			
		||||
        <script>
 | 
			
		||||
            var host = null, port = null;
 | 
			
		||||
            var sc;
 | 
			
		||||
 | 
			
		||||
            function spice_error(e)
 | 
			
		||||
            {
 | 
			
		||||
                disconnect();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function connect()
 | 
			
		||||
            {
 | 
			
		||||
                var host, port, password, scheme = "ws://", uri;
 | 
			
		||||
 | 
			
		||||
                host = document.getElementById("host").value;
 | 
			
		||||
                port = document.getElementById("port").value;
 | 
			
		||||
                password = document.getElementById("password").value;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                if ((!host) || (!port)) {
 | 
			
		||||
                    console.log("must set host and port");
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (sc) {
 | 
			
		||||
                    sc.stop();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                uri = scheme + host + ":" + port;
 | 
			
		||||
 | 
			
		||||
                document.getElementById('connectButton').innerHTML = "Stop";
 | 
			
		||||
                document.getElementById('connectButton').onclick = disconnect;
 | 
			
		||||
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    sc = new SpiceMainConn({uri: uri, screen_id: "spice-screen", dump_id: "debug-div",
 | 
			
		||||
                                message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected });
 | 
			
		||||
                }
 | 
			
		||||
                catch (e)
 | 
			
		||||
                {
 | 
			
		||||
                    alert(e.toString());
 | 
			
		||||
                    disconnect();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function disconnect()
 | 
			
		||||
            {
 | 
			
		||||
                console.log(">> disconnect");
 | 
			
		||||
                if (sc) {
 | 
			
		||||
                    sc.stop();
 | 
			
		||||
                }
 | 
			
		||||
                document.getElementById('connectButton').innerHTML = "Start";
 | 
			
		||||
                document.getElementById('connectButton').onclick = connect;
 | 
			
		||||
                if (window.File && window.FileReader && window.FileList && window.Blob)
 | 
			
		||||
                {
 | 
			
		||||
                    var spice_xfer_area = document.getElementById('spice-xfer-area');
 | 
			
		||||
                    document.getElementById('spice-area').removeChild(spice_xfer_area);
 | 
			
		||||
                    document.getElementById('spice-area').removeEventListener('dragover', handle_file_dragover, false);
 | 
			
		||||
                    document.getElementById('spice-area').removeEventListener('drop', handle_file_drop, false);
 | 
			
		||||
                }
 | 
			
		||||
                console.log("<< disconnect");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function agent_connected(sc)
 | 
			
		||||
            {
 | 
			
		||||
                window.addEventListener('resize', handle_resize);
 | 
			
		||||
                window.spice_connection = this;
 | 
			
		||||
 | 
			
		||||
                resize_helper(this);
 | 
			
		||||
 | 
			
		||||
                if (window.File && window.FileReader && window.FileList && window.Blob)
 | 
			
		||||
                {
 | 
			
		||||
                    var spice_xfer_area = document.createElement("div");
 | 
			
		||||
                    spice_xfer_area.setAttribute('id', 'spice-xfer-area');
 | 
			
		||||
                    document.getElementById('spice-area').appendChild(spice_xfer_area);
 | 
			
		||||
                    document.getElementById('spice-area').addEventListener('dragover', handle_file_dragover, false);
 | 
			
		||||
                    document.getElementById('spice-area').addEventListener('drop', handle_file_drop, false);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    console.log("File API is not supported");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function toggle_console()
 | 
			
		||||
            {
 | 
			
		||||
                var checkbox = document.getElementById('show_console');
 | 
			
		||||
                var m = document.getElementById('message-div');
 | 
			
		||||
 | 
			
		||||
                if (checkbox.checked)
 | 
			
		||||
                {
 | 
			
		||||
                    m.style.display = 'block';
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    m.style.display = 'none';
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                window.addEventListener('resize', handle_resize);
 | 
			
		||||
                resize_helper(sc);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function sendCtrlAltFN(f) {
 | 
			
		||||
                if (sc && sc.inputs && sc.inputs.state === "ready"){
 | 
			
		||||
                    var keys_code=[KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_F11,KEY_F12];
 | 
			
		||||
 | 
			
		||||
                    if (keys_code[f]==undefined) {
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var key = new SpiceMsgcKeyDown();
 | 
			
		||||
                    var msg = new SpiceMiniData();
 | 
			
		||||
 | 
			
		||||
                    update_modifier(true, KEY_LCtrl, sc);
 | 
			
		||||
                    update_modifier(true, KEY_Alt, sc);
 | 
			
		||||
 | 
			
		||||
                    key.code = keys_code[f];
 | 
			
		||||
                    msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
 | 
			
		||||
                    sc.inputs.send_msg(msg);
 | 
			
		||||
                    msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
 | 
			
		||||
                    sc.inputs.send_msg(msg);
 | 
			
		||||
 | 
			
		||||
                    if(Ctrl_state == false) update_modifier(false, KEY_LCtrl, sc);
 | 
			
		||||
                    if(Alt_state == false) update_modifier(false, KEY_Alt, sc);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
             function fullscreen() {
 | 
			
		||||
                var screen=document.getElementById('spice-area');
 | 
			
		||||
                if(screen.requestFullscreen) {
 | 
			
		||||
                    screen.requestFullscreen();
 | 
			
		||||
                } else if(screen.mozRequestFullScreen) {
 | 
			
		||||
                    screen.mozRequestFullScreen();
 | 
			
		||||
                } else if(screen.webkitRequestFullscreen) {
 | 
			
		||||
                    screen.webkitRequestFullscreen();
 | 
			
		||||
                } else if(screen.msRequestFullscreen) {
 | 
			
		||||
                    screen.msRequestFullscreen();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            /* SPICE port event listeners
 | 
			
		||||
            window.addEventListener('spice-port-data', function(event) {
 | 
			
		||||
                // Here we convert data to text, but really we can obtain binary data also
 | 
			
		||||
                var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data));
 | 
			
		||||
                DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            window.addEventListener('spice-port-event', function(event) {
 | 
			
		||||
                DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent);
 | 
			
		||||
            });
 | 
			
		||||
            */
 | 
			
		||||
            document.getElementById("fullscreen_button").addEventListener('click', fullscreen;
 | 
			
		||||
 | 
			
		||||
            connect();
 | 
			
		||||
        </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
							
								
								
									
										262
									
								
								console/templates/console-spice-lite.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,262 @@
 | 
			
		|||
<!--
 | 
			
		||||
   Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com>
 | 
			
		||||
 | 
			
		||||
   This file is part of spice-html5.
 | 
			
		||||
 | 
			
		||||
   spice-html5 is free software: you can redistribute it and/or modify
 | 
			
		||||
   it under the terms of the GNU Lesser General Public License as published by
 | 
			
		||||
   the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
   (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
   spice-html5 is distributed in the hope that it will be useful,
 | 
			
		||||
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
   GNU Lesser General Public License for more details.
 | 
			
		||||
 | 
			
		||||
   You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
   along with spice-html5.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
   --------------------------------------------------
 | 
			
		||||
    Spice Javascript client template.
 | 
			
		||||
    Refer to main.js for more detailed information
 | 
			
		||||
   --------------------------------------------------
 | 
			
		||||
 | 
			
		||||
-->
 | 
			
		||||
{% extends "console-base.html" %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
{% load staticfiles %}
 | 
			
		||||
{% block head %}
 | 
			
		||||
 | 
			
		||||
        <title>Spice Javascript client</title>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicearraybuffer.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/enums.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/atKeynames.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/utils.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/png.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/lz.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/quic.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/bitmap.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicedataview.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicetype.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spicemsg.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/wire.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/spiceconn.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/display.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/main.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/inputs.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/webm.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/playback.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/simulatecursor.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/cursor.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/jsbn.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/rsa.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/prng4.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/rng.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/thirdparty/sha1.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/ticket.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/resize.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/filexfer.js" %}"></script>
 | 
			
		||||
        <script src="{% static "js/spice-html5/port.js" %}"></script>
 | 
			
		||||
 | 
			
		||||
        <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
        <div id="spice-area">
 | 
			
		||||
            <div id="spice-screen" class="spice-screen"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="message-div" class="spice-message"></div>
 | 
			
		||||
 | 
			
		||||
        <div id="debug-div">
 | 
			
		||||
        <!-- If DUMPXXX is turned on, dumped images will go here -->
 | 
			
		||||
        </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block foot %}
 | 
			
		||||
    <script>
 | 
			
		||||
            var host = null, port = null;
 | 
			
		||||
            var sc;
 | 
			
		||||
 | 
			
		||||
            function spice_set_cookie(name, value, days) {
 | 
			
		||||
                var date, expires;
 | 
			
		||||
                date = new Date();
 | 
			
		||||
                date.setTime(date.getTime() + (days*24*60*60*1000));
 | 
			
		||||
                expires = "; expires=" + date.toGMTString();
 | 
			
		||||
                document.cookie = name + "=" + value + expires + "; path=/";
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            function spice_query_var(name, defvalue) {
 | 
			
		||||
                var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
 | 
			
		||||
                return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : defvalue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function spice_error(e)
 | 
			
		||||
            {
 | 
			
		||||
                console.log(e);
 | 
			
		||||
                disconnect();
 | 
			
		||||
                if (e.message !== undefined) {
 | 
			
		||||
                    log_error(e.message);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    log_error('Unknown error');
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function connect()
 | 
			
		||||
            {
 | 
			
		||||
                var host, port, password, scheme = "ws://", uri;
 | 
			
		||||
 | 
			
		||||
                // By default, use the host and port of server that served this file
 | 
			
		||||
                //host = spice_query_var('host', window.location.hostname);
 | 
			
		||||
                host = '{{ ws_host| safe }}'| spice_query_var('host', window.location.hostname);
 | 
			
		||||
 | 
			
		||||
                // Note that using the web server port only makes sense
 | 
			
		||||
                //  if your web server has a reverse proxy to relay the WebSocket
 | 
			
		||||
                //  traffic to the correct destination port.
 | 
			
		||||
                var default_port = window.location.port;
 | 
			
		||||
                if (!default_port) {
 | 
			
		||||
                    if (window.location.protocol == 'http:') {
 | 
			
		||||
                        default_port = 80;
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (window.location.protocol == 'https:') {
 | 
			
		||||
                        default_port = 443;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                //port = spice_query_var('port', default_port);
 | 
			
		||||
                port = '{{ ws_port| safe }}' | spice_query_var('port', default_port);
 | 
			
		||||
                if (window.location.protocol == 'https:') {
 | 
			
		||||
                    scheme = "wss://";
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // If a token variable is passed in, set the parameter in a cookie.
 | 
			
		||||
                // This is used by nova-spiceproxy.
 | 
			
		||||
                token = spice_query_var('token', null);
 | 
			
		||||
                if (token) {
 | 
			
		||||
                    spice_set_cookie('token', token, 1)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                //password = spice_query_var('password', '');
 | 
			
		||||
                password = '{{ console_passwd | safe }}' | spice_query_var('password', '');
 | 
			
		||||
                path = spice_query_var('path', 'websockify');
 | 
			
		||||
 | 
			
		||||
                if ((!host) || (!port)) {
 | 
			
		||||
                    console.log("must specify host and port in URL");
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (sc) {
 | 
			
		||||
                    sc.stop();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                uri = scheme + host + ":" + port;
 | 
			
		||||
 | 
			
		||||
                if (path) {
 | 
			
		||||
                  uri += path[0] == '/' ? path : ('/' + path);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    sc = new SpiceMainConn({uri: uri, screen_id: "spice-screen", dump_id: "debug-div",
 | 
			
		||||
                                message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected });
 | 
			
		||||
                }
 | 
			
		||||
                catch (e)
 | 
			
		||||
                {
 | 
			
		||||
                    alert(e.toString());
 | 
			
		||||
                    disconnect();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function disconnect()
 | 
			
		||||
            {
 | 
			
		||||
                console.log(">> disconnect");
 | 
			
		||||
                if (sc) {
 | 
			
		||||
                    sc.stop();
 | 
			
		||||
                }
 | 
			
		||||
                if (window.File && window.FileReader && window.FileList && window.Blob)
 | 
			
		||||
                {
 | 
			
		||||
                    var spice_xfer_area = document.getElementById('spice-xfer-area');
 | 
			
		||||
                    document.getElementById('spice-area').removeChild(spice_xfer_area);
 | 
			
		||||
                    document.getElementById('spice-area').removeEventListener('dragover', handle_file_dragover, false);
 | 
			
		||||
                    document.getElementById('spice-area').removeEventListener('drop', handle_file_drop, false);
 | 
			
		||||
                }
 | 
			
		||||
                console.log("<< disconnect");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function agent_connected(sc)
 | 
			
		||||
            {
 | 
			
		||||
                window.addEventListener('resize', handle_resize);
 | 
			
		||||
                window.spice_connection = this;
 | 
			
		||||
 | 
			
		||||
                resize_helper(this);
 | 
			
		||||
 | 
			
		||||
                if (window.File && window.FileReader && window.FileList && window.Blob)
 | 
			
		||||
                {
 | 
			
		||||
                    var spice_xfer_area = document.createElement("div");
 | 
			
		||||
                    spice_xfer_area.setAttribute('id', 'spice-xfer-area');
 | 
			
		||||
                    document.getElementById('spice-area').appendChild(spice_xfer_area);
 | 
			
		||||
                    document.getElementById('spice-area').addEventListener('dragover', handle_file_dragover, false);
 | 
			
		||||
                    document.getElementById('spice-area').addEventListener('drop', handle_file_drop, false);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    console.log("File API is not supported");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function sendCtrlAltFN(f) {
 | 
			
		||||
                if (sc && sc.inputs && sc.inputs.state === "ready"){
 | 
			
		||||
                    var keys_code=[KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_F11,KEY_F12];
 | 
			
		||||
 | 
			
		||||
                    if (keys_code[f]==undefined) {
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    var key = new SpiceMsgcKeyDown();
 | 
			
		||||
                    var msg = new SpiceMiniData();
 | 
			
		||||
 | 
			
		||||
                    update_modifier(true, KEY_LCtrl, sc);
 | 
			
		||||
                    update_modifier(true, KEY_Alt, sc);
 | 
			
		||||
 | 
			
		||||
                    key.code = keys_code[f];
 | 
			
		||||
                    msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
 | 
			
		||||
                    sc.inputs.send_msg(msg);
 | 
			
		||||
                    msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
 | 
			
		||||
                    sc.inputs.send_msg(msg);
 | 
			
		||||
 | 
			
		||||
                    if(Ctrl_state == false) update_modifier(false, KEY_LCtrl, sc);
 | 
			
		||||
                    if(Alt_state == false) update_modifier(false, KEY_Alt, sc);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function fullscreen() {
 | 
			
		||||
                var screen=document.getElementById('spice-area');
 | 
			
		||||
                if(screen.requestFullscreen) {
 | 
			
		||||
                    screen.requestFullscreen();
 | 
			
		||||
                } else if(screen.mozRequestFullScreen) {
 | 
			
		||||
                    screen.mozRequestFullScreen();
 | 
			
		||||
                } else if(screen.webkitRequestFullscreen) {
 | 
			
		||||
                    screen.webkitRequestFullscreen();
 | 
			
		||||
                } else if(screen.msRequestFullscreen) {
 | 
			
		||||
                    screen.msRequestFullscreen();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* SPICE port event listeners
 | 
			
		||||
            window.addEventListener('spice-port-data', function(event) {
 | 
			
		||||
                // Here we convert data to text, but really we can obtain binary data also
 | 
			
		||||
                var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data));
 | 
			
		||||
                DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            window.addEventListener('spice-port-event', function(event) {
 | 
			
		||||
                DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent);
 | 
			
		||||
            });
 | 
			
		||||
            */
 | 
			
		||||
            document.getElementById("fullscreen_button").addEventListener('click', fullscreen);
 | 
			
		||||
            connect();
 | 
			
		||||
        </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,199 +0,0 @@
 | 
			
		|||
{% extends "console-base.html" %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
{% load staticfiles %}
 | 
			
		||||
{% block head %}
 | 
			
		||||
    <script src="{% static "js/spice-html5/spicearraybuffer.js" %}"></script> 
 | 
			
		||||
    <script src="{% static "js/spice-html5/enums.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/atKeynames.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/utils.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/png.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/lz.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/quic.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/bitmap.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/spicedataview.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/spicetype.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/spicemsg.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/wire.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/spiceconn.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/display.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/main.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/inputs.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/webm.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/playback.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/simulatecursor.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/cursor.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/thirdparty/jsbn.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/thirdparty/rsa.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/thirdparty/prng4.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/thirdparty/rng.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/thirdparty/sha1.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/ticket.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/resize.js" %}"></script>
 | 
			
		||||
    <script src="{% static "js/spice-html5/filexfer.js" %}"></script>
 | 
			
		||||
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
 | 
			
		||||
    <script src="{% static "js/spice-html5/port.js" %}"></script>
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div id='spice_container'></div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block foot %}
 | 
			
		||||
<script>
 | 
			
		||||
    var sc;
 | 
			
		||||
 | 
			
		||||
    function spice_set_cookie(name, value, days) {
 | 
			
		||||
        var date, expires;
 | 
			
		||||
        date = new Date();
 | 
			
		||||
        date.setTime(date.getTime() + (days*24*60*60*1000));
 | 
			
		||||
        expires = "; expires=" + date.toGMTString();
 | 
			
		||||
        document.cookie = name + "=" + value + expires + "; path=/";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    function spice_query_var(name, defvalue) {
 | 
			
		||||
        var match = RegExp('[?&]' + name + '=([^&]*)')
 | 
			
		||||
                          .exec(window.location.search);
 | 
			
		||||
        return match ?
 | 
			
		||||
            decodeURIComponent(match[1].replace(/\+/g, ' '))
 | 
			
		||||
            : defvalue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function spice_error(e)
 | 
			
		||||
    {
 | 
			
		||||
        console.log(e);
 | 
			
		||||
        disconnect();
 | 
			
		||||
        if (e.message !== undefined) {
 | 
			
		||||
            log_error(e.message);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            log_error('Unknown error');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function spice_success(msg) {
 | 
			
		||||
        log_info(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function connect(uri,password)
 | 
			
		||||
    {
 | 
			
		||||
        // If a token variable is passed in, set the parameter in a cookie.
 | 
			
		||||
        // This is used by nova-spiceproxy.
 | 
			
		||||
        token = spice_query_var('token', null);
 | 
			
		||||
        if (token) {
 | 
			
		||||
            spice_set_cookie('token', token, 1)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (sc) {
 | 
			
		||||
            sc.stop();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            sc = new SpiceMainConn({uri: uri, password: password, screen_id: "spice_container",
 | 
			
		||||
                        onsuccess: spice_success, onerror: spice_error, onagent: agent_connected });
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        catch (e)
 | 
			
		||||
        {
 | 
			
		||||
            console.log(e);
 | 
			
		||||
            log_error(e.toString());
 | 
			
		||||
            disconnect();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function disconnect()
 | 
			
		||||
    {
 | 
			
		||||
        console.log(">> disconnect");
 | 
			
		||||
        if (sc) {
 | 
			
		||||
            sc.stop();
 | 
			
		||||
        }
 | 
			
		||||
        if (window.File && window.FileReader && window.FileList && window.Blob)
 | 
			
		||||
        {
 | 
			
		||||
            console.log(" -> Disable drag/drop transfer");
 | 
			
		||||
            var spice_xfer_area = document.getElementById('spice-xfer-area');
 | 
			
		||||
            try {
 | 
			
		||||
                document.getElementById('spice-area').removeChild(spice_xfer_area);
 | 
			
		||||
                document.getElementById('spice-area').removeEventListener('dragover', handle_file_dragover, false);
 | 
			
		||||
                document.getElementById('spice-area').removeEventListener('drop', handle_file_drop, false);
 | 
			
		||||
            }
 | 
			
		||||
            catch(e) {
 | 
			
		||||
                console.log(' -> Error disabling drag/drop transfer');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        console.log("<< disconnect");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function agent_connected(sc) {
 | 
			
		||||
        window.addEventListener('resize', handle_resize);
 | 
			
		||||
        window.spice_connection = this;
 | 
			
		||||
 | 
			
		||||
        resize_helper(this);
 | 
			
		||||
 | 
			
		||||
        if (window.File && window.FileReader && window.FileList && window.Blob)
 | 
			
		||||
        {
 | 
			
		||||
            var spice_xfer_area = document.createElement("div");
 | 
			
		||||
            spice_xfer_area.setAttribute('id', 'spice-xfer-area');
 | 
			
		||||
            document.getElementById('spice-area').addEventListener('dragover', handle_file_dragover, false);
 | 
			
		||||
            document.getElementById('spice-area').addEventListener('drop', handle_file_drop, false);
 | 
			
		||||
            log_info('Drag and drop transfer enabled.');
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            console.log("File API is not supported");
 | 
			
		||||
            log_info('Drag and drop transfer not supported.');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function sendCtrlAltFN(f) {
 | 
			
		||||
        if (sc && sc.inputs && sc.inputs.state === "ready"){
 | 
			
		||||
            var keys_code=[KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_F11,KEY_F12];
 | 
			
		||||
 | 
			
		||||
            if (keys_code[f]==undefined) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            var key = new SpiceMsgcKeyDown();
 | 
			
		||||
            var msg = new SpiceMiniData();
 | 
			
		||||
 | 
			
		||||
            update_modifier(true, KEY_LCtrl, sc);
 | 
			
		||||
            update_modifier(true, KEY_Alt, sc);
 | 
			
		||||
 | 
			
		||||
            key.code = keys_code[f];
 | 
			
		||||
            msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
 | 
			
		||||
            sc.inputs.send_msg(msg);
 | 
			
		||||
            msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
 | 
			
		||||
            sc.inputs.send_msg(msg);
 | 
			
		||||
 | 
			
		||||
            if(Ctrl_state == false) update_modifier(false, KEY_LCtrl, sc);
 | 
			
		||||
            if(Alt_state == false) update_modifier(false, KEY_Alt, sc);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function fullscreen() {
 | 
			
		||||
        var screen=document.getElementById('spice_container');
 | 
			
		||||
        if(screen.requestFullscreen) {
 | 
			
		||||
            screen.requestFullscreen();
 | 
			
		||||
        } else if(screen.mozRequestFullScreen) {
 | 
			
		||||
            screen.mozRequestFullScreen();
 | 
			
		||||
        } else if(screen.webkitRequestFullscreen) {
 | 
			
		||||
            screen.webkitRequestFullscreen();
 | 
			
		||||
        } else if(screen.msRequestFullscreen) {
 | 
			
		||||
            screen.msRequestFullscreen();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var uri;
 | 
			
		||||
    if (window.location.protocol === "https:") {
 | 
			
		||||
        uri = 'wss://{{ ws_host }}:{{ ws_port }}';
 | 
			
		||||
    } else {
 | 
			
		||||
        uri = 'ws://{{ ws_host }}:{{ ws_port }}';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var password = '{{ console_passwd }}';
 | 
			
		||||
    log_info('Connecting ...');
 | 
			
		||||
    connect(uri,password);
 | 
			
		||||
</script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
							
								
								
									
										323
									
								
								console/templates/console-vnc-full.html
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,323 @@
 | 
			
		|||
{% extends "console-base.html" %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
{% load staticfiles %}
 | 
			
		||||
 | 
			
		||||
{% block head %}
 | 
			
		||||
    <!--
 | 
			
		||||
    noVNC example: simple example using default UI
 | 
			
		||||
    Copyright (C) 2012 Joel Martin
 | 
			
		||||
    Copyright (C) 2016 Samuel Mannehed for Cendio AB
 | 
			
		||||
    Copyright (C) 2016 Pierre Ossman 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).
 | 
			
		||||
 | 
			
		||||
    Connect parameters are provided in query string:
 | 
			
		||||
        http://example.com/?host=HOST&port=PORT&encrypt=1
 | 
			
		||||
    or the fragment:
 | 
			
		||||
        http://example.com/#host=HOST&port=PORT&encrypt=1
 | 
			
		||||
    -->
 | 
			
		||||
    <title xmlns="http://www.w3.org/1999/html">WebVirtCloud - noVNC</title>
 | 
			
		||||
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
 | 
			
		||||
    <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
 | 
			
		||||
                Remove this if you use the .htaccess -->
 | 
			
		||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
 | 
			
		||||
 | 
			
		||||
    <!-- Icons (see Makefile for what the sizes are for) -->
 | 
			
		||||
    <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="24x24" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-24x24.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="32x32" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-32x32.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="48x48" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-48x48.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="64x64" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-64x64.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="72x72" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-72x72.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="96x96" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-96x96.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="144x144" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-144x144.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="192x192" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-192x192.png" %}">
 | 
			
		||||
    <!-- Firefox currently mishandles SVG, see #1419039
 | 
			
		||||
    <link rel="icon" sizes="any" type="image/svg+xml" href="{% static "js/novnc/app/images/icons/novnc-icon.svg" %}">
 | 
			
		||||
    -->
 | 
			
		||||
    <!-- Repeated last so that legacy handling will pick this -->
 | 
			
		||||
    <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}">
 | 
			
		||||
 | 
			
		||||
    <!-- Apple iOS Safari settings -->
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
 | 
			
		||||
    <meta name="apple-mobile-web-app-capable" content="yes" />
 | 
			
		||||
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
 | 
			
		||||
    <!-- Home Screen Icons (favourites and bookmarks use the normal icons) -->
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}">
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}">
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}">
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}">
 | 
			
		||||
 | 
			
		||||
    <!-- Stylesheets -->
 | 
			
		||||
    <link rel="stylesheet" href="{% static "js/novnc/app/styles/base.css" %}"/>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    <script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
    <!-- this is included as a normal file in order to catch script-loading errors as well -->
 | 
			
		||||
    <script type="text/javascript" src="{% static "js/novnc/app/error-handler.js" %}"></script>
 | 
			
		||||
 | 
			
		||||
    <!-- begin scripts -->
 | 
			
		||||
    <script src="{% static "js/novnc/app.js" %}"></script>
 | 
			
		||||
    <!-- end scripts -->
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
    <div id="noVNC_fallback_error" class="noVNC_center">
 | 
			
		||||
        <div>
 | 
			
		||||
            <div>noVNC encountered an error:</div>
 | 
			
		||||
            <br>
 | 
			
		||||
            <div id="noVNC_fallback_errormsg"></div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- noVNC Control Bar -->
 | 
			
		||||
    <div id="noVNC_control_bar_anchor" class="noVNC_vcenter">
 | 
			
		||||
 | 
			
		||||
        <div id="noVNC_control_bar">
 | 
			
		||||
            <div id="noVNC_control_bar_handle" title="Hide/Show the control bar"><div></div></div>
 | 
			
		||||
 | 
			
		||||
            <div class="noVNC_scroll">
 | 
			
		||||
 | 
			
		||||
            <h1 class="noVNC_logo" translate="no"><span>no</span><br />VNC</h1>
 | 
			
		||||
 | 
			
		||||
            <!-- Drag/Pan the viewport -->
 | 
			
		||||
            <input type="image" alt="viewport drag" src="{% static "js/novnc/app/images/drag.svg" %}"
 | 
			
		||||
                id="noVNC_view_drag_button" class="noVNC_button noVNC_hidden"
 | 
			
		||||
                title="Move/Drag Viewport" />
 | 
			
		||||
 | 
			
		||||
            <!--noVNC Touch Device only buttons-->
 | 
			
		||||
            <div id="noVNC_mobile_buttons">
 | 
			
		||||
                <input type="image" alt="No mousebutton" src="{% static "js/novnc/app/images/mouse_none.svg" %}"
 | 
			
		||||
                    id="noVNC_mouse_button0" class="noVNC_button"
 | 
			
		||||
                    title="Active Mouse Button"/>
 | 
			
		||||
                <input type="image" alt="Left mousebutton" src="{% static "js/novnc/app/images/mouse_left.svg" %}"
 | 
			
		||||
                    id="noVNC_mouse_button1" class="noVNC_button"
 | 
			
		||||
                    title="Active Mouse Button"/>
 | 
			
		||||
                <input type="image" alt="Middle mousebutton" src="{% static "js/novnc/app/images/mouse_middle.svg" %}"
 | 
			
		||||
                    id="noVNC_mouse_button2" class="noVNC_button"
 | 
			
		||||
                    title="Active Mouse Button"/>
 | 
			
		||||
                <input type="image" alt="Right mousebutton" src="{% static "js/novnc/app/images/mouse_right.svg" %}"
 | 
			
		||||
                    id="noVNC_mouse_button4" class="noVNC_button"
 | 
			
		||||
                    title="Active Mouse Button"/>
 | 
			
		||||
                <input type="image" alt="Keyboard" src="{% static "js/novnc/app/images/keyboard.svg" %}"
 | 
			
		||||
                    id="noVNC_keyboard_button" class="noVNC_button"
 | 
			
		||||
                    value="Keyboard" title="Show Keyboard" />
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- Extra manual keys -->
 | 
			
		||||
            <div id="noVNC_extra_keys">
 | 
			
		||||
                <input type="image" alt="Extra keys" src="{% static "js/novnc/app/images/toggleextrakeys.svg" %}"
 | 
			
		||||
                    id="noVNC_toggle_extra_keys_button" class="noVNC_button"
 | 
			
		||||
                    title="Show Extra Keys"/>
 | 
			
		||||
                <div class="noVNC_vcenter">
 | 
			
		||||
                <div id="noVNC_modifiers" class="noVNC_panel">
 | 
			
		||||
                    <input type="image" alt="Ctrl" src="{% static "js/novnc/app/images/ctrl.svg" %}"
 | 
			
		||||
                        id="noVNC_toggle_ctrl_button" class="noVNC_button"
 | 
			
		||||
                        title="Toggle Ctrl"/>
 | 
			
		||||
                    <input type="image" alt="Alt" src="{% static "js/novnc/app/images/alt.svg" %}"
 | 
			
		||||
                        id="noVNC_toggle_alt_button" class="noVNC_button"
 | 
			
		||||
                        title="Toggle Alt"/>
 | 
			
		||||
                    <input type="image" alt="Tab" src="{% static "js/novnc/app/images/tab.svg" %}"
 | 
			
		||||
                        id="noVNC_send_tab_button" class="noVNC_button"
 | 
			
		||||
                        title="Send Tab"/>
 | 
			
		||||
                    <input type="image" alt="Esc" src="{% static "js/novnc/app/images/esc.svg" %}"
 | 
			
		||||
                        id="noVNC_send_esc_button" class="noVNC_button"
 | 
			
		||||
                        title="Send Escape"/>
 | 
			
		||||
                    <input type="image" alt="Ctrl+Alt+Del" src="{% static "js/novnc/app/images/ctrlaltdel.svg" %}"
 | 
			
		||||
                        id="noVNC_send_ctrl_alt_del_button" class="noVNC_button"
 | 
			
		||||
                        title="Send Ctrl-Alt-Del" />
 | 
			
		||||
                </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- Shutdown/Reboot -->
 | 
			
		||||
            <input type="image" alt="Shutdown/Reboot" src="{% static "js/novnc/app/images/power.svg" %}"
 | 
			
		||||
                id="noVNC_power_button" class="noVNC_button"
 | 
			
		||||
                title="Shutdown/Reboot..." />
 | 
			
		||||
            <div class="noVNC_vcenter">
 | 
			
		||||
            <div id="noVNC_power" class="noVNC_panel">
 | 
			
		||||
                <div class="noVNC_heading">
 | 
			
		||||
                    <img src="{% static "js/novnc/app/images/power.svg" %}"> Power
 | 
			
		||||
                </div>
 | 
			
		||||
                <input type="button" id="noVNC_shutdown_button" value="Shutdown" />
 | 
			
		||||
                <input type="button" id="noVNC_reboot_button" value="Reboot" />
 | 
			
		||||
                <input type="button" id="noVNC_reset_button" value="Reset" />
 | 
			
		||||
            </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- Clipboard -->
 | 
			
		||||
            <input type="image" alt="Clipboard" src="{% static "js/novnc/app/images/clipboard.svg" %}"
 | 
			
		||||
                id="noVNC_clipboard_button" class="noVNC_button"
 | 
			
		||||
                title="Clipboard" />
 | 
			
		||||
            <div class="noVNC_vcenter">
 | 
			
		||||
            <div id="noVNC_clipboard" class="noVNC_panel">
 | 
			
		||||
                <div class="noVNC_heading">
 | 
			
		||||
                    <img src="{% static "js/novnc/app/images/clipboard.svg" %}"> Clipboard
 | 
			
		||||
                </div>
 | 
			
		||||
                <textarea id="noVNC_clipboard_text" rows=5></textarea>
 | 
			
		||||
                <br />
 | 
			
		||||
                <input id="noVNC_clipboard_clear_button" type="button"
 | 
			
		||||
                    value="Clear" class="noVNC_submit" />
 | 
			
		||||
            </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- Toggle fullscreen -->
 | 
			
		||||
            <input type="image" alt="Fullscreen" src="{% static "js/novnc/app/images/fullscreen.svg" %}"
 | 
			
		||||
                id="noVNC_fullscreen_button" class="noVNC_button noVNC_hidden"
 | 
			
		||||
                title="Fullscreen" />
 | 
			
		||||
 | 
			
		||||
            <!-- Settings -->
 | 
			
		||||
            <input type="image" alt="Settings" src="{% static "js/novnc/app/images/settings.svg" %}"
 | 
			
		||||
                id="noVNC_settings_button" class="noVNC_button"
 | 
			
		||||
                title="Settings" />
 | 
			
		||||
            <div class="noVNC_vcenter">
 | 
			
		||||
            <div id="noVNC_settings" class="noVNC_panel">
 | 
			
		||||
                <ul>
 | 
			
		||||
                    <li class="noVNC_heading">
 | 
			
		||||
                        <img src="{% static "js/novnc/app/images/settings.svg" %}"> Settings
 | 
			
		||||
                    </li>
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <label><input id="noVNC_setting_shared" type="checkbox" /> Shared Mode</label>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <label><input id="noVNC_setting_view_only" type="checkbox" /> View Only</label>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    <li><hr></li>
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <label><input id="noVNC_setting_view_clip" type="checkbox" /> Clip to Window</label>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <label for="noVNC_setting_resize">Scaling Mode:</label>
 | 
			
		||||
                        <select id="noVNC_setting_resize" name="vncResize">
 | 
			
		||||
                            <option value="off">None</option>
 | 
			
		||||
                            <option value="scale">Local Scaling</option>
 | 
			
		||||
                            <option value="remote">Remote Resizing</option>
 | 
			
		||||
                        </select>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    <li><hr></li>
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <div class="noVNC_expander">Advanced</div>
 | 
			
		||||
                        <div><ul>
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <label for="noVNC_setting_repeaterID">Repeater ID:</label>
 | 
			
		||||
                                <input id="noVNC_setting_repeaterID" type="input" value="" />
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <div class="noVNC_expander">WebSocket</div>
 | 
			
		||||
                                <div><ul>
 | 
			
		||||
                                    <li>
 | 
			
		||||
                                        <label><input id="noVNC_setting_encrypt" type="checkbox" /> Encrypt</label>
 | 
			
		||||
                                    </li>
 | 
			
		||||
                                    <li>
 | 
			
		||||
                                        <label for="noVNC_setting_host">Host:</label>
 | 
			
		||||
                                        <input id="noVNC_setting_host" value="{{ ws_host }}"/>
 | 
			
		||||
                                    </li>
 | 
			
		||||
                                    <li>
 | 
			
		||||
                                        <label for="noVNC_setting_port">Port:</label>
 | 
			
		||||
                                        <input id="noVNC_setting_port" value="{{ ws_port }}" type="number" />
 | 
			
		||||
                                    </li>
 | 
			
		||||
                                    <li>
 | 
			
		||||
                                        <label for="noVNC_setting_path">Path:</label>
 | 
			
		||||
                                        <input id="noVNC_setting_path" type="input" value="websockify" />
 | 
			
		||||
                                    </li>
 | 
			
		||||
                                </ul></div>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li><hr></li>
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <label><input id="noVNC_setting_reconnect" type="checkbox" /> Automatic Reconnect</label>
 | 
			
		||||
                                <input id="noVNC_setting_autoconnect" type="checkbox" value="true" hidden/>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <label for="noVNC_setting_reconnect_delay">Reconnect Delay (ms):</label>
 | 
			
		||||
                                <input id="noVNC_setting_reconnect_delay" type="number" />
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li><hr></li>
 | 
			
		||||
                            <!-- Logging selection dropdown -->
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <label>Logging:
 | 
			
		||||
                                    <select id="noVNC_setting_logging" name="vncLogging">
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </label>
 | 
			
		||||
                            </li>
 | 
			
		||||
                        </ul></div>
 | 
			
		||||
                    </li>
 | 
			
		||||
                </ul>
 | 
			
		||||
            </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- Connection Controls -->
 | 
			
		||||
            <input type="image" alt="Disconnect" src="{% static "js/novnc/app/images/disconnect.svg" %}"
 | 
			
		||||
                id="noVNC_disconnect_button" class="noVNC_button"
 | 
			
		||||
                title="Disconnect" />
 | 
			
		||||
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div id="noVNC_control_bar_hint"></div>
 | 
			
		||||
 | 
			
		||||
    </div> <!-- End of noVNC_control_bar -->
 | 
			
		||||
 | 
			
		||||
    <!-- Status Dialog -->
 | 
			
		||||
    <div id="noVNC_status"></div>
 | 
			
		||||
 | 
			
		||||
    <!-- Connect button -->
 | 
			
		||||
    <div class="noVNC_center">
 | 
			
		||||
        <div id="noVNC_connect_dlg">
 | 
			
		||||
            <div class="noVNC_logo" translate="no"><span>no</span>VNC</div>
 | 
			
		||||
            <div id="noVNC_connect_button">
 | 
			
		||||
                <div>
 | 
			
		||||
                <img src="{% static "js/novnc/app/images/connect.svg" %}"> Connect
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Password Dialog -->
 | 
			
		||||
    <div class="noVNC_center noVNC_connect_layer">
 | 
			
		||||
    <div id="noVNC_password_dlg" class="noVNC_panel"><form>
 | 
			
		||||
        <ul>
 | 
			
		||||
            <li>
 | 
			
		||||
                <label>Password:</label>
 | 
			
		||||
                <input id="noVNC_password_input" type="password" />
 | 
			
		||||
            </li>
 | 
			
		||||
            <li>
 | 
			
		||||
                <input id="noVNC_password_button" type="submit" value="Send Password" class="noVNC_submit" />
 | 
			
		||||
            </li>
 | 
			
		||||
        </ul>
 | 
			
		||||
    </form></div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Transition Screens -->
 | 
			
		||||
    <div id="noVNC_transition">
 | 
			
		||||
        <div id="noVNC_transition_text"></div>
 | 
			
		||||
        <div>
 | 
			
		||||
        <input type="button" id="noVNC_cancel_reconnect_button" value="Cancel" class="noVNC_submit" />
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="noVNC_spinner"></div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- This is where the RFB elements will attach -->
 | 
			
		||||
    <div id="noVNC_container">
 | 
			
		||||
        <!-- Note that Google Chrome on Android doesn't respect any of these,
 | 
			
		||||
             html attributes which attempt to disable text suggestions on the
 | 
			
		||||
             on-screen keyboard. Let's hope Chrome implements the ime-mode
 | 
			
		||||
             style for example -->
 | 
			
		||||
        <textarea id="noVNC_keyboardinput" autocapitalize="off"
 | 
			
		||||
            autocorrect="off" autocomplete="off" spellcheck="false"
 | 
			
		||||
            mozactionhint="Enter" tabindex="-1"></textarea>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <audio id="noVNC_bell">
 | 
			
		||||
        <source src="{% static "js/novnc/app/sounds/bell.oga" %}" type="audio/ogg">
 | 
			
		||||
        <source src="{% static "js/novnc/app/sounds/bell.mp3" %}" type="audio/mpeg">
 | 
			
		||||
    </audio>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
							
								
								
									
										266
									
								
								console/templates/console-vnc-lite.html
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,266 @@
 | 
			
		|||
{% extends "console-base.html" %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
{% load staticfiles %}
 | 
			
		||||
{% block head %}
 | 
			
		||||
    <!--
 | 
			
		||||
    noVNC example: lightweight example using minimal UI and features
 | 
			
		||||
    Copyright (C) 2012 Joel Martin
 | 
			
		||||
    Copyright (C) 2017 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).
 | 
			
		||||
 | 
			
		||||
    Connect parameters are provided in query string:
 | 
			
		||||
        http://example.com/?host=HOST&port=PORT&encrypt=1
 | 
			
		||||
    or the fragment:
 | 
			
		||||
        http://example.com/#host=HOST&port=PORT&encrypt=1
 | 
			
		||||
    -->
 | 
			
		||||
    <title>noVNC</title>
 | 
			
		||||
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
 | 
			
		||||
    <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
 | 
			
		||||
                Remove this if you use the .htaccess -->
 | 
			
		||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 | 
			
		||||
 | 
			
		||||
    <!-- Icons (see Makefile for what the sizes are for) -->
 | 
			
		||||
    <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="24x24" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-24x24.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="32x32" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-32x32.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="48x48" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-48x48.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="64x64" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-64x64.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="72x72" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-72x72.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="96x96" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-96x96.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="144x144" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-144x144.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}">
 | 
			
		||||
    <link rel="icon" sizes="192x192" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-192x192.png" %}">
 | 
			
		||||
    <!-- Firefox currently mishandles SVG, see #1419039
 | 
			
		||||
    <link rel="icon" sizes="any" type="image/svg+xml" href="{% static "js/novnc/app/images/icons/novnc-icon.svg" %}">
 | 
			
		||||
    -->
 | 
			
		||||
    <!-- Repeated last so that legacy handling will pick this -->
 | 
			
		||||
    <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}">
 | 
			
		||||
 | 
			
		||||
    <!-- Apple iOS Safari settings -->
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
 | 
			
		||||
    <meta name="apple-mobile-web-app-capable" content="yes" />
 | 
			
		||||
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
 | 
			
		||||
    <!-- Home Screen Icons (favourites and bookmarks use the normal icons) -->
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}">
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}">
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}">
 | 
			
		||||
    <link rel="apple-touch-icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}">
 | 
			
		||||
 | 
			
		||||
    <!-- Stylesheets -->
 | 
			
		||||
    <link rel="stylesheet" href="{% static "js/novnc/app/styles/lite.css" %}">
 | 
			
		||||
 | 
			
		||||
     <!--
 | 
			
		||||
    <script type='text/javascript'
 | 
			
		||||
        src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
    <!-- promise polyfills promises for IE11 -->
 | 
			
		||||
    <script src="{% static "js/novnc/vendor/promise.js" %}"></script>
 | 
			
		||||
    <!-- ES2015/ES6 modules polyfill -->
 | 
			
		||||
    <script type="module">
 | 
			
		||||
        window._noVNC_has_module_support = true;
 | 
			
		||||
    </script>
 | 
			
		||||
    <script>
 | 
			
		||||
        window.addEventListener("load", function() {
 | 
			
		||||
            if (window._noVNC_has_module_support) return;
 | 
			
		||||
            var loader = document.createElement("script");
 | 
			
		||||
            loader.src = "{% static "js/novnc/vendor/browser-es-module-loader/dist/browser-es-module-loader.js" %}";
 | 
			
		||||
            document.head.appendChild(loader);
 | 
			
		||||
        });
 | 
			
		||||
    </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
    <div id="noVNC_status_bar">
 | 
			
		||||
        <div id="noVNC_left_dummy_elem"></div>
 | 
			
		||||
        <div id="noVNC_status">Loading</div>
 | 
			
		||||
        <div id="noVNC_buttons">
 | 
			
		||||
            <input type=button value="Send CtrlAltDel" id="sendCtrlAltDelButton" class="noVNC_shown">
 | 
			
		||||
            <span id="noVNC_power_buttons" class="noVNC_hidden">
 | 
			
		||||
                <input type=button value="Shutdown" id="machineShutdownButton">
 | 
			
		||||
                <input type=button value="Reboot" id="machineRebootButton">
 | 
			
		||||
                <input type=button value="Reset" id="machineResetButton">
 | 
			
		||||
            </span>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div id='vnc_container'></div>
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block foot %}
 | 
			
		||||
        <!-- actual script modules -->
 | 
			
		||||
    <script type="module" crossorigin="anonymous">
 | 
			
		||||
        // Load supporting scripts
 | 
			
		||||
        import * as WebUtil from '{% static "js/novnc/app/webutil.js" %}';
 | 
			
		||||
        import RFB from '{% static "js/novnc/core/rfb.js" %}';
 | 
			
		||||
 | 
			
		||||
        var rfb;
 | 
			
		||||
        var desktopName;
 | 
			
		||||
 | 
			
		||||
        function updateDesktopName(e) {
 | 
			
		||||
            desktopName = e.detail.name;
 | 
			
		||||
        }
 | 
			
		||||
        function credentials(e) {
 | 
			
		||||
            var html;
 | 
			
		||||
 | 
			
		||||
            var form = document.createElement('form');
 | 
			
		||||
            form.innerHTML = '<label></label>';
 | 
			
		||||
            form.innerHTML += '<input type=password size=10 id="password_input">';
 | 
			
		||||
            form.onsubmit = setPassword;
 | 
			
		||||
 | 
			
		||||
            // bypass status() because it sets text content
 | 
			
		||||
            document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
 | 
			
		||||
            document.getElementById('noVNC_status').innerHTML = '';
 | 
			
		||||
            document.getElementById('noVNC_status').appendChild(form);
 | 
			
		||||
            document.getElementById('noVNC_status').querySelector('label').textContent = 'Password Required: ';
 | 
			
		||||
        }
 | 
			
		||||
        function setPassword() {
 | 
			
		||||
            rfb.sendCredentials({ password: document.getElementById('password_input').value });
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        function sendCtrlAltDel() {
 | 
			
		||||
            rfb.sendCtrlAltDel();
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        function machineShutdown() {
 | 
			
		||||
            rfb.machineShutdown();
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        function machineReboot() {
 | 
			
		||||
            rfb.machineReboot();
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        function machineReset() {
 | 
			
		||||
            rfb.machineReset();
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        function status(text, level) {
 | 
			
		||||
            switch (level) {
 | 
			
		||||
                case 'normal':
 | 
			
		||||
                case 'warn':
 | 
			
		||||
                case 'error':
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    level = "warn";
 | 
			
		||||
            }
 | 
			
		||||
            document.getElementById('noVNC_status_bar').className = "noVNC_status_" + level;
 | 
			
		||||
            document.getElementById('noVNC_status').textContent = text;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function connected(e) {
 | 
			
		||||
            document.getElementById('sendCtrlAltDelButton').disabled = false;
 | 
			
		||||
            if (WebUtil.getConfigVar('encrypt', (window.location.protocol === "https:"))) {
 | 
			
		||||
                status("Connected (encrypted) to " + desktopName, "normal");
 | 
			
		||||
            } else {
 | 
			
		||||
                status("Connected (unencrypted) to " + desktopName, "normal");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function disconnected(e) {
 | 
			
		||||
            document.getElementById('sendCtrlAltDelButton').disabled = true;
 | 
			
		||||
            updatePowerButtons();
 | 
			
		||||
            if (e.detail.clean) {
 | 
			
		||||
                status("Disconnected", "normal");
 | 
			
		||||
            } else {
 | 
			
		||||
                status("Something went wrong, connection is closed", "error");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        function updatePowerButtons() {
 | 
			
		||||
            var powerbuttons;
 | 
			
		||||
            powerbuttons = document.getElementById('noVNC_power_buttons');
 | 
			
		||||
            if (rfb.capabilities.power) {
 | 
			
		||||
                powerbuttons.className= "noVNC_shown";
 | 
			
		||||
            } else {
 | 
			
		||||
                powerbuttons.className = "noVNC_hidden";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
 | 
			
		||||
        document.getElementById('machineShutdownButton').onclick = machineShutdown;
 | 
			
		||||
        document.getElementById('machineRebootButton').onclick = machineReboot;
 | 
			
		||||
        document.getElementById('machineResetButton').onclick = machineReset;
 | 
			
		||||
 | 
			
		||||
        WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn'));
 | 
			
		||||
        document.title = WebUtil.getConfigVar('title', 'noVNC');
 | 
			
		||||
        // By default, use the host and port of server that served this file
 | 
			
		||||
        //var host = WebUtil.getConfigVar('host', window.location.hostname);
 | 
			
		||||
        //var port = WebUtil.getConfigVar('port', window.location.port);
 | 
			
		||||
        var host = '{{ ws_host }}';
 | 
			
		||||
        var port = '{{ ws_port }}';
 | 
			
		||||
 | 
			
		||||
        // if port == 80 (or 443) then it won't be present and should be
 | 
			
		||||
        // set manually
 | 
			
		||||
        if (!port) {
 | 
			
		||||
            if (window.location.protocol.substring(0,5) == 'https') {
 | 
			
		||||
                port = 443;
 | 
			
		||||
            }
 | 
			
		||||
            else if (window.location.protocol.substring(0,4) == 'http') {
 | 
			
		||||
                port = 80;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //var password = WebUtil.getConfigVar('password', '');
 | 
			
		||||
        var password = '{{ console_passwd }}';
 | 
			
		||||
 | 
			
		||||
        var path = WebUtil.getConfigVar('path', 'websockify');
 | 
			
		||||
 | 
			
		||||
        // If a token variable is passed in, set the parameter in a cookie.
 | 
			
		||||
        // This is used by nova-novncproxy.
 | 
			
		||||
        var token = WebUtil.getConfigVar('token', null);
 | 
			
		||||
        if (token) {
 | 
			
		||||
            // if token is already present in the path we should use it
 | 
			
		||||
            path = WebUtil.injectParamIfMissing(path, "token", token);
 | 
			
		||||
 | 
			
		||||
            WebUtil.createCookie('token', token, 1)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        (function() {
 | 
			
		||||
 | 
			
		||||
            status("Connecting", "normal");
 | 
			
		||||
 | 
			
		||||
            if ((!host) || (!port)) {
 | 
			
		||||
                status('Must specify host and port in URL', 'error');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var url;
 | 
			
		||||
 | 
			
		||||
            if (WebUtil.getConfigVar('encrypt', (window.location.protocol === "https:"))) {
 | 
			
		||||
                url = 'wss';
 | 
			
		||||
            } else {
 | 
			
		||||
                url = 'ws';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            url += '://' + host;
 | 
			
		||||
            if(port) {
 | 
			
		||||
                url += ':' + port;
 | 
			
		||||
            }
 | 
			
		||||
            url += '/' + path;
 | 
			
		||||
 | 
			
		||||
//            rfb = new RFB(document.body, url,
 | 
			
		||||
 //                         { repeaterID: WebUtil.getConfigVar('repeaterID', ''),
 | 
			
		||||
   //                         shared: WebUtil.getConfigVar('shared', true),
 | 
			
		||||
     //                       credentials: { password: password } });
 | 
			
		||||
            rfb = new RFB(document.getElementById('vnc_container'), url,
 | 
			
		||||
                         { repeaterID: WebUtil.getConfigVar('repeaterID', ''),
 | 
			
		||||
                           shared: WebUtil.getConfigVar('shared', true),
 | 
			
		||||
                           credentials: { password: password } });
 | 
			
		||||
 | 
			
		||||
            rfb.viewOnly = WebUtil.getConfigVar('view_only', false);
 | 
			
		||||
            rfb.addEventListener("connect",  connected);
 | 
			
		||||
            rfb.addEventListener("disconnect", disconnected);
 | 
			
		||||
            rfb.addEventListener("capabilities", function () { updatePowerButtons(); });
 | 
			
		||||
            rfb.addEventListener("credentialsrequired", credentials);
 | 
			
		||||
            rfb.addEventListener("desktopname", updateDesktopName);
 | 
			
		||||
            rfb.scaleViewport = WebUtil.getConfigVar('scale', false);
 | 
			
		||||
            rfb.resizeSession = WebUtil.getConfigVar('resize', false);
 | 
			
		||||
        })();
 | 
			
		||||
    </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			@ -29,9 +29,9 @@
 | 
			
		|||
              style="display: none;">
 | 
			
		||||
    </textarea>
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block foot %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
    /*jslint white: false */
 | 
			
		||||
    /*global window, $, Util, RFB, */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ def console(request):
 | 
			
		|||
 | 
			
		||||
    if request.method == 'GET':
 | 
			
		||||
        token = request.GET.get('token', '')
 | 
			
		||||
        view_type = request.GET.get('view', 'lite')
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        temptoken = token.split('-', 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -45,13 +46,12 @@ def console(request):
 | 
			
		|||
    if ':' in ws_host:
 | 
			
		||||
        ws_host = re.sub(':[0-9]+', '', ws_host)
 | 
			
		||||
 | 
			
		||||
    if console_type == 'vnc':
 | 
			
		||||
        response = render(request, 'console-vnc.html', locals())
 | 
			
		||||
    elif console_type == 'spice':
 | 
			
		||||
        response = render(request, 'console-spice.html', locals())
 | 
			
		||||
    console_page = "console-" + console_type + "-" + view_type + ".html"
 | 
			
		||||
    if console_type == 'vnc' or console_type == 'spice':
 | 
			
		||||
        response = render(request, console_page, locals())
 | 
			
		||||
    else:
 | 
			
		||||
        console_error = "Console type: %s no support" % console_type
 | 
			
		||||
        response = render(request, 'console-vnc.html', locals())
 | 
			
		||||
        response = render(request, 'console-vnc-lite.html', locals())
 | 
			
		||||
 | 
			
		||||
    response.set_cookie('token', token)
 | 
			
		||||
    return response
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -249,7 +249,19 @@
 | 
			
		|||
                                            <div role="tabpanel" class="tab-pane tab-pane-bordered active" id="vnconsole">
 | 
			
		||||
                                                <p>{% trans "This action opens a new window with a VNC connection to the console of the instance." %}</p>
 | 
			
		||||
                                                {% ifequal status 1 %}
 | 
			
		||||
                                                    <a href="#" class="btn btn-lg btn-success pull-right" title="Console port: {{ console_port }}" onclick="open_console()">{% trans "Console" %}</a>
 | 
			
		||||
                                                    <!-- Split button -->
 | 
			
		||||
                                                    <div class="btn-group pull-right">
 | 
			
		||||
                                                        <button type="button" class="btn btn-lg btn-success " onclick="open_console('lite')">Console</button>
 | 
			
		||||
                                                        <button type="button" class="btn btn-lg btn-success dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 | 
			
		||||
                                                            <span class="caret"></span>
 | 
			
		||||
                                                            <span class="sr-only">Toggle Dropdown</span>
 | 
			
		||||
                                                        </button>
 | 
			
		||||
                                                        <ul class="dropdown-menu">
 | 
			
		||||
                                                            <li><a href="#" title="Console port: {{ console_port }}" onclick="open_console('lite')">{% trans "Console - Lite" %}</a></li>
 | 
			
		||||
                                                            <li><a href="#" title="Console port: {{ console_port }}" onclick="open_console('full')">{% trans "Console - Full" %}</a></li>
 | 
			
		||||
                                                        </ul>
 | 
			
		||||
                                                    </div>
 | 
			
		||||
 | 
			
		||||
                                                {% else %}
 | 
			
		||||
                                                    <button class="btn btn-lg btn-success pull-right disabled">{% trans "Console" %}</button>
 | 
			
		||||
                                                {% endifequal %}
 | 
			
		||||
| 
						 | 
				
			
			@ -1193,8 +1205,8 @@
 | 
			
		|||
    });
 | 
			
		||||
</script>
 | 
			
		||||
<script>
 | 
			
		||||
    function open_console() {
 | 
			
		||||
        window.open('{% url 'console' %}?token={{ compute_id }}-{{ uuid }}', '', 'width=850,height=485')
 | 
			
		||||
    function open_console(view_style) {
 | 
			
		||||
        window.open('{% url 'console' %}?token={{ compute_id }}-{{ uuid }}&view=' +view_style +'', '', 'width=850,height=600')
 | 
			
		||||
    }
 | 
			
		||||
</script>
 | 
			
		||||
<script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12069
									
								
								static/js/novnc/app.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										56
									
								
								static/js/novnc/app/error-handler.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
// NB: this should *not* be included as a module until we have
 | 
			
		||||
// native support in the browsers, so that our error handler
 | 
			
		||||
// can catch script-loading errors.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(function(){
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    // Fallback for all uncought errors
 | 
			
		||||
    function handleError (event, err) {
 | 
			
		||||
        try {
 | 
			
		||||
            var msg = document.getElementById('noVNC_fallback_errormsg');
 | 
			
		||||
 | 
			
		||||
            // Only show the initial error
 | 
			
		||||
            if (msg.hasChildNodes()) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var div = document.createElement("div");
 | 
			
		||||
            div.classList.add('noVNC_message');
 | 
			
		||||
            div.appendChild(document.createTextNode(event.message));
 | 
			
		||||
            msg.appendChild(div);
 | 
			
		||||
 | 
			
		||||
            if (event.filename) {
 | 
			
		||||
                div = document.createElement("div");
 | 
			
		||||
                div.className = 'noVNC_location';
 | 
			
		||||
                var text = event.filename;
 | 
			
		||||
                if (event.lineno !== undefined) {
 | 
			
		||||
                    text += ":" + event.lineno;
 | 
			
		||||
                    if (event.colno !== undefined) {
 | 
			
		||||
                        text += ":" + event.colno;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                div.appendChild(document.createTextNode(text));
 | 
			
		||||
                msg.appendChild(div);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (err && (err.stack !== undefined)) {
 | 
			
		||||
                div = document.createElement("div");
 | 
			
		||||
                div.className = 'noVNC_stack';
 | 
			
		||||
                div.appendChild(document.createTextNode(err.stack));
 | 
			
		||||
                msg.appendChild(div);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            document.getElementById('noVNC_fallback_error')
 | 
			
		||||
                .classList.add("noVNC_open");
 | 
			
		||||
        } catch (exc) {
 | 
			
		||||
            document.write("noVNC encountered an error.");
 | 
			
		||||
        }
 | 
			
		||||
        // Don't return true since this would prevent the error
 | 
			
		||||
        // from being printed to the browser console.
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    window.addEventListener('error', function (evt) { handleError(evt, evt.error); });
 | 
			
		||||
    window.addEventListener('unhandledrejection', function (evt) { handleError(evt.reason, evt.reason); });
 | 
			
		||||
})();
 | 
			
		||||
							
								
								
									
										92
									
								
								static/js/novnc/app/images/alt.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="alt.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="16"
 | 
			
		||||
     inkscape:cx="18.205425"
 | 
			
		||||
     inkscape:cy="17.531398"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <g
 | 
			
		||||
       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
       id="text5290">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 9.9560547,1042.3329 -2.9394531,0 -0.4638672,1.3281 -1.8896485,0 2.7001953,-7.29 2.241211,0 2.7001958,7.29 -1.889649,0 -0.4589843,-1.3281 z m -2.4707031,-1.3526 1.9970703,0 -0.9960938,-2.9003 -1.0009765,2.9003 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5340" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 13.188477,1036.0634 1.748046,0 0,7.5976 -1.748046,0 0,-7.5976 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5342" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 18.535156,1036.6395 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151367,0.5176 0.151368,0.1318 0.600586,0.1318 l 0.898438,0 0,1.25 -1.499024,0 q -1.035156,0 -1.469726,-0.4297 -0.429688,-0.4345 -0.429688,-1.4697 l 0,-2.3193 -0.86914,0 0,-1.25 0.86914,0 0,-1.5528 1.748047,0 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5344" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.5 KiB  | 
							
								
								
									
										106
									
								
								static/js/novnc/app/images/clipboard.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="clipboard.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="15.366606"
 | 
			
		||||
     inkscape:cy="16.42981"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="M 9,6 6,6 C 5.4459889,6 5,6.4459889 5,7 l 0,13 c 0,0.554011 0.4459889,1 1,1 l 13,0 c 0.554011,0 1,-0.445989 1,-1 L 20,7 C 20,6.4459889 19.554011,6 19,6 l -3,0"
 | 
			
		||||
       transform="translate(0,1027.3622)"
 | 
			
		||||
       id="rect6083"
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       sodipodi:nodetypes="cssssssssc" />
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect6085"
 | 
			
		||||
       width="7"
 | 
			
		||||
       height="4"
 | 
			
		||||
       x="9"
 | 
			
		||||
       y="1031.3622"
 | 
			
		||||
       ry="1.00002" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
 | 
			
		||||
       d="m 8.5071212,1038.8622 7.9999998,0"
 | 
			
		||||
       id="path6087"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
 | 
			
		||||
       d="m 8.5071212,1041.8622 3.9999998,0"
 | 
			
		||||
       id="path6089"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
 | 
			
		||||
       d="m 8.5071212,1044.8622 5.9999998,0"
 | 
			
		||||
       id="path6091"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.9 KiB  | 
							
								
								
									
										96
									
								
								static/js/novnc/app/images/connect.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="connect.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="37.14834"
 | 
			
		||||
     inkscape:cy="1.9525926"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <g
 | 
			
		||||
       id="g5103"
 | 
			
		||||
       transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,-729.15757,315.8823)">
 | 
			
		||||
      <path
 | 
			
		||||
         sodipodi:nodetypes="cssssc"
 | 
			
		||||
         inkscape:connector-curvature="0"
 | 
			
		||||
         id="rect5096"
 | 
			
		||||
         d="m 11,1040.3622 -5,0 c -1.108,0 -2,-0.892 -2,-2 l 0,-4 c 0,-1.108 0.892,-2 2,-2 l 5,0"
 | 
			
		||||
         style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
      <path
 | 
			
		||||
         style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
         d="m 14,1032.3622 5,0 c 1.108,0 2,0.892 2,2 l 0,4 c 0,1.108 -0.892,2 -2,2 l -5,0"
 | 
			
		||||
         id="path5099"
 | 
			
		||||
         inkscape:connector-curvature="0"
 | 
			
		||||
         sodipodi:nodetypes="cssssc" />
 | 
			
		||||
      <path
 | 
			
		||||
         inkscape:connector-curvature="0"
 | 
			
		||||
         id="path5101"
 | 
			
		||||
         d="m 9,1036.3622 7,0"
 | 
			
		||||
         style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.3 KiB  | 
							
								
								
									
										96
									
								
								static/js/novnc/app/images/ctrl.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="ctrl.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="16"
 | 
			
		||||
     inkscape:cx="18.205425"
 | 
			
		||||
     inkscape:cy="17.531398"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <g
 | 
			
		||||
       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
       id="text5290">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 9.1210938,1043.1898 q -0.5175782,0.2686 -1.0791016,0.4053 -0.5615235,0.1367 -1.171875,0.1367 -1.8212891,0 -2.8857422,-1.0156 -1.0644531,-1.0205 -1.0644531,-2.7637 0,-1.748 1.0644531,-2.7637 1.0644531,-1.0205 2.8857422,-1.0205 0.6103515,0 1.171875,0.1368 0.5615234,0.1367 1.0791016,0.4052 l 0,1.5088 q -0.522461,-0.3564 -1.0302735,-0.5224 -0.5078125,-0.1661 -1.0693359,-0.1661 -1.0058594,0 -1.5820313,0.6446 -0.5761719,0.6445 -0.5761719,1.7773 0,1.1279 0.5761719,1.7725 0.5761719,0.6445 1.5820313,0.6445 0.5615234,0 1.0693359,-0.166 0.5078125,-0.166 1.0302735,-0.5225 l 0,1.5088 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5370" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 12.514648,1036.5687 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151368,0.5176 0.151367,0.1318 0.600586,0.1318 l 0.898437,0 0,1.25 -1.499023,0 q -1.035157,0 -1.469727,-0.4297 -0.429687,-0.4345 -0.429687,-1.4697 l 0,-2.3193 -0.8691411,0 0,-1.25 0.8691411,0 0,-1.5528 1.748046,0 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5372" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 19.453125,1039.6107 q -0.229492,-0.1074 -0.458984,-0.1562 -0.22461,-0.054 -0.454102,-0.054 -0.673828,0 -1.040039,0.4345 -0.361328,0.4297 -0.361328,1.2354 l 0,2.5195 -1.748047,0 0,-5.4687 1.748047,0 0,0.8984 q 0.336914,-0.5371 0.771484,-0.7813 0.439453,-0.249 1.049805,-0.249 0.08789,0 0.19043,0.01 0.102539,0 0.297851,0.029 l 0.0049,1.582 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5374" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 20.332031,1035.9926 1.748047,0 0,7.5976 -1.748047,0 0,-7.5976 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5376" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 4.3 KiB  | 
							
								
								
									
										100
									
								
								static/js/novnc/app/images/ctrlaltdel.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,100 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="ctrlaltdel.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="8"
 | 
			
		||||
     inkscape:cx="11.135667"
 | 
			
		||||
     inkscape:cy="16.407428"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect5253"
 | 
			
		||||
       width="5"
 | 
			
		||||
       height="5.0000172"
 | 
			
		||||
       x="16"
 | 
			
		||||
       y="1031.3622"
 | 
			
		||||
       ry="1.0000174" />
 | 
			
		||||
    <rect
 | 
			
		||||
       y="1043.3622"
 | 
			
		||||
       x="4"
 | 
			
		||||
       height="5.0000172"
 | 
			
		||||
       width="5"
 | 
			
		||||
       id="rect5255"
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       ry="1.0000174" />
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect5257"
 | 
			
		||||
       width="5"
 | 
			
		||||
       height="5.0000172"
 | 
			
		||||
       x="13"
 | 
			
		||||
       y="1043.3622"
 | 
			
		||||
       ry="1.0000174" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.2 KiB  | 
							
								
								
									
										94
									
								
								static/js/novnc/app/images/disconnect.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,94 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="disconnect.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="16"
 | 
			
		||||
     inkscape:cx="25.05707"
 | 
			
		||||
     inkscape:cy="11.594858"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <g
 | 
			
		||||
       id="g5171"
 | 
			
		||||
       transform="translate(-24.062499,-6.15775e-4)">
 | 
			
		||||
      <path
 | 
			
		||||
         id="path5110"
 | 
			
		||||
         transform="translate(0,1027.3622)"
 | 
			
		||||
         d="m 39.744141,3.4960938 c -0.769923,0 -1.539607,0.2915468 -2.121094,0.8730468 l -2.566406,2.5664063 1.414062,1.4140625 2.566406,-2.5664063 c 0.403974,-0.404 1.010089,-0.404 1.414063,0 l 2.828125,2.828125 c 0.40398,0.4039 0.403907,1.0101621 0,1.4140629 l -2.566406,2.566406 1.414062,1.414062 2.566406,-2.566406 c 1.163041,-1.1629 1.162968,-3.0791874 0,-4.2421874 L 41.865234,4.3691406 C 41.283747,3.7876406 40.514063,3.4960937 39.744141,3.4960938 Z M 39.017578,9.015625 a 1.0001,1.0001 0 0 0 -0.6875,0.3027344 l -0.445312,0.4453125 1.414062,1.4140621 0.445313,-0.445312 A 1.0001,1.0001 0 0 0 39.017578,9.015625 Z m -6.363281,0.7070312 a 1.0001,1.0001 0 0 0 -0.6875,0.3027348 L 28.431641,13.5625 c -1.163042,1.163 -1.16297,3.079187 0,4.242188 l 2.828125,2.828124 c 1.162974,1.163101 3.079213,1.163101 4.242187,0 l 3.535156,-3.535156 a 1.0001,1.0001 0 1 0 -1.414062,-1.414062 l -3.535156,3.535156 c -0.403974,0.404 -1.010089,0.404 -1.414063,0 l -2.828125,-2.828125 c -0.403981,-0.404 -0.403908,-1.010162 0,-1.414063 l 3.535156,-3.537109 A 1.0001,1.0001 0 0 0 32.654297,9.7226562 Z m 3.109375,2.1621098 -2.382813,2.384765 a 1.0001,1.0001 0 1 0 1.414063,1.414063 l 2.382812,-2.384766 -1.414062,-1.414062 z"
 | 
			
		||||
         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
         inkscape:connector-curvature="0" />
 | 
			
		||||
      <rect
 | 
			
		||||
         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
 | 
			
		||||
         y="752.29541"
 | 
			
		||||
         x="-712.31262"
 | 
			
		||||
         height="18.000017"
 | 
			
		||||
         width="3"
 | 
			
		||||
         id="rect5116"
 | 
			
		||||
         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 4.9 KiB  | 
							
								
								
									
										76
									
								
								static/js/novnc/app/images/drag.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="drag.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="22.627417"
 | 
			
		||||
     inkscape:cx="9.8789407"
 | 
			
		||||
     inkscape:cy="9.5008608"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="true"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="m 7.039733,1049.3037 c -0.4309106,-0.1233 -0.7932634,-0.4631 -0.9705434,-0.9103 -0.04922,-0.1241 -0.057118,-0.2988 -0.071321,-1.5771 l -0.015972,-1.4375 -0.328125,-0.082 c -0.7668138,-0.1927 -1.1897046,-0.4275 -1.7031253,-0.9457 -0.4586773,-0.4629 -0.6804297,-0.8433 -0.867034,-1.4875 -0.067215,-0.232 -0.068001,-0.2642 -0.078682,-3.2188 -0.012078,-3.341 -0.020337,-3.2012 0.2099452,-3.5555 0.2246623,-0.3458 0.5798271,-0.5892 0.9667343,-0.6626 0.092506,-0.017 0.531898,-0.032 0.9764271,-0.032 l 0.8082347,0 1.157e-4,1.336 c 1.125e-4,1.2779 0.00281,1.3403 0.062214,1.4378 0.091785,0.1505 0.2357707,0.226 0.4314082,0.2261 0.285389,2e-4 0.454884,-0.1352 0.5058962,-0.4042 0.019355,-0.102 0.031616,-0.982 0.031616,-2.269 0,-1.9756 0.00357,-2.1138 0.059205,-2.2926 0.1645475,-0.5287 0.6307616,-0.9246 1.19078,-1.0113 0.8000572,-0.1238 1.5711277,0.4446 1.6860387,1.2429 0.01732,0.1203 0.03177,0.8248 0.03211,1.5657 6.19e-4,1.3449 7.22e-4,1.347 0.07093,1.4499 0.108355,0.1587 0.255268,0.2248 0.46917,0.2108 0.204069,-0.013 0.316116,-0.08 0.413642,-0.2453 0.06028,-0.1024 0.06307,-0.1778 0.07862,-2.1218 0.01462,-1.8283 0.02124,-2.0285 0.07121,-2.1549 0.260673,-0.659 0.934894,-1.0527 1.621129,-0.9465 0.640523,0.099 1.152269,0.6104 1.243187,1.2421 0.01827,0.1269 0.03175,0.9943 0.03211,2.0657 l 6.19e-4,1.8469 0.07031,0.103 c 0.108355,0.1587 0.255267,0.2248 0.46917,0.2108 0.204069,-0.013 0.316115,-0.08 0.413642,-0.2453 0.05951,-0.1011 0.06329,-0.1786 0.07907,-1.6218 0.01469,-1.3438 0.02277,-1.5314 0.07121,-1.6549 0.257975,-0.6576 0.934425,-1.0527 1.620676,-0.9465 0.640522,0.099 1.152269,0.6104 1.243186,1.2421 0.0186,0.1292 0.03179,1.0759 0.03222,2.3125 7.15e-4,2.0335 0.0025,2.0966 0.06283,2.1956 0.09178,0.1505 0.235771,0.226 0.431409,0.2261 0.285388,2e-4 0.454884,-0.1352 0.505897,-0.4042 0.01874,-0.099 0.03161,-0.8192 0.03161,-1.769 0,-1.4848 0.0043,-1.6163 0.0592,-1.7926 0.164548,-0.5287 0.630762,-0.9246 1.19078,-1.0113 0.800057,-0.1238 1.571128,0.4446 1.686039,1.2429 0.04318,0.2999 0.04372,9.1764 5.78e-4,9.4531 -0.04431,0.2841 -0.217814,0.6241 -0.420069,0.8232 -0.320102,0.315 -0.63307,0.4268 -1.194973,0.4268 l -0.35281,0 -2.51e-4,1.2734 c -1.25e-4,0.7046 -0.01439,1.3642 -0.03191,1.4766 -0.06665,0.4274 -0.372966,0.8704 -0.740031,1.0702 -0.349999,0.1905 0.01748,0.18 -6.242199,0.1776 -5.3622439,0 -5.7320152,-0.01 -5.9121592,-0.057 l 1.4e-5,0 z"
 | 
			
		||||
       id="path4379"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 4.6 KiB  | 
							
								
								
									
										81
									
								
								static/js/novnc/app/images/error.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,81 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="error.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="14.00357"
 | 
			
		||||
     inkscape:cy="12.443398"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title />
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="M 7 3 C 4.7839905 3 3 4.7839905 3 7 L 3 18 C 3 20.21601 4.7839905 22 7 22 L 18 22 C 20.21601 22 22 20.21601 22 18 L 22 7 C 22 4.7839905 20.21601 3 18 3 L 7 3 z M 7.6992188 6 A 1.6916875 1.6924297 0 0 1 8.9121094 6.5117188 L 12.5 10.101562 L 16.087891 6.5117188 A 1.6916875 1.6924297 0 0 1 17.251953 6 A 1.6916875 1.6924297 0 0 1 18.480469 8.90625 L 14.892578 12.496094 L 18.480469 16.085938 A 1.6916875 1.6924297 0 1 1 16.087891 18.478516 L 12.5 14.888672 L 8.9121094 18.478516 A 1.6916875 1.6924297 0 1 1 6.5214844 16.085938 L 10.109375 12.496094 L 6.5214844 8.90625 A 1.6916875 1.6924297 0 0 1 7.6992188 6 z "
 | 
			
		||||
       transform="translate(0,1027.3622)"
 | 
			
		||||
       id="rect4135" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3 KiB  | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/esc.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="esc.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="16"
 | 
			
		||||
     inkscape:cx="18.205425"
 | 
			
		||||
     inkscape:cy="17.531398"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="text5290"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <g
 | 
			
		||||
       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
       id="text5290">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 3.9331055,1036.1464 5.0732422,0 0,1.4209 -3.1933594,0 0,1.3574 3.0029297,0 0,1.4209 -3.0029297,0 0,1.6699 3.3007812,0 0,1.4209 -5.180664,0 0,-7.29 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5314" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 14.963379,1038.1385 0,1.3282 q -0.561524,-0.2344 -1.083984,-0.3516 -0.522461,-0.1172 -0.986329,-0.1172 -0.498046,0 -0.742187,0.127 -0.239258,0.122 -0.239258,0.3808 0,0.21 0.180664,0.3223 0.185547,0.1123 0.65918,0.166 l 0.307617,0.044 q 1.342773,0.1709 1.806641,0.5615 0.463867,0.3906 0.463867,1.2256 0,0.874 -0.644531,1.3134 -0.644532,0.4395 -1.923829,0.4395 -0.541992,0 -1.123046,-0.088 -0.576172,-0.083 -1.186524,-0.2539 l 0,-1.3281 q 0.522461,0.2539 1.069336,0.3808 0.551758,0.127 1.118164,0.127 0.512695,0 0.771485,-0.1416 0.258789,-0.1416 0.258789,-0.4199 0,-0.2344 -0.180664,-0.3467 -0.175782,-0.1172 -0.708008,-0.1807 l -0.307617,-0.039 q -1.166993,-0.1465 -1.635743,-0.542 -0.46875,-0.3955 -0.46875,-1.2012 0,-0.8691 0.595703,-1.2891 0.595704,-0.4199 1.826172,-0.4199 0.483399,0 1.015625,0.073 0.532227,0.073 1.157227,0.2294 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5316" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 21.066895,1038.1385 0,1.4258 q -0.356446,-0.2441 -0.717774,-0.3613 -0.356445,-0.1172 -0.742187,-0.1172 -0.732422,0 -1.142579,0.4297 -0.405273,0.4248 -0.405273,1.1914 0,0.7666 0.405273,1.1963 0.410157,0.4248 1.142579,0.4248 0.410156,0 0.776367,-0.1221 0.371094,-0.122 0.683594,-0.3613 l 0,1.4307 q -0.410157,0.1513 -0.834961,0.2246 -0.419922,0.078 -0.844727,0.078 -1.479492,0 -2.314453,-0.7568 -0.834961,-0.7618 -0.834961,-2.1143 0,-1.3525 0.834961,-2.1094 0.834961,-0.7617 2.314453,-0.7617 0.429688,0 0.844727,0.078 0.419921,0.073 0.834961,0.2246 z"
 | 
			
		||||
         style="font-size:10px;fill:#ffffff;fill-opacity:1"
 | 
			
		||||
         id="path5318" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 4.4 KiB  | 
							
								
								
									
										69
									
								
								static/js/novnc/app/images/expander.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="9"
 | 
			
		||||
   height="10"
 | 
			
		||||
   viewBox="0 0 9 10"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="expander.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#ffffff"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0.0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="45.254834"
 | 
			
		||||
     inkscape:cx="9.8737281"
 | 
			
		||||
     inkscape:cy="6.4583132"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="true"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-object-midpoints="false"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1042.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="M 2.0800781,1042.3633 A 2.0002,2.0002 0 0 0 0,1044.3613 l 0,6 a 2.0002,2.0002 0 0 0 3.0292969,1.7168 l 5,-3 a 2.0002,2.0002 0 0 0 0,-3.4316 l -5,-3 a 2.0002,2.0002 0 0 0 -0.9492188,-0.2832 z"
 | 
			
		||||
       id="path4138"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3 KiB  | 
							
								
								
									
										93
									
								
								static/js/novnc/app/images/fullscreen.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,93 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="fullscreen.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="16.400723"
 | 
			
		||||
     inkscape:cy="15.083758"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect5006"
 | 
			
		||||
       width="17"
 | 
			
		||||
       height="17.000017"
 | 
			
		||||
       x="4"
 | 
			
		||||
       y="1031.3622"
 | 
			
		||||
       ry="3.0000174" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
 | 
			
		||||
       d="m 7.5,1044.8622 4,0 -1.5,-1.5 1.5,-1.5 -1,-1 -1.5,1.5 -1.5,-1.5 0,4 z"
 | 
			
		||||
       id="path5017"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
    <path
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       id="path5025"
 | 
			
		||||
       d="m 17.5,1034.8622 -4,0 1.5,1.5 -1.5,1.5 1,1 1.5,-1.5 1.5,1.5 0,-4 z"
 | 
			
		||||
       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.1 KiB  | 
							
								
								
									
										82
									
								
								static/js/novnc/app/images/handle.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="5"
 | 
			
		||||
   height="6"
 | 
			
		||||
   viewBox="0 0 5 6"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="handle.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="32"
 | 
			
		||||
     inkscape:cx="1.3551778"
 | 
			
		||||
     inkscape:cy="8.7800329"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="true"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1046.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
       d="m 4.0000803,1049.3622 -3,-2 0,4 z"
 | 
			
		||||
       id="path4247"
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       sodipodi:nodetypes="cccc" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 2.5 KiB  | 
							
								
								
									
										172
									
								
								static/js/novnc/app/images/handle_bg.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,172 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="15"
 | 
			
		||||
   height="50"
 | 
			
		||||
   viewBox="0 0 15 50"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="handle_bg.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="16"
 | 
			
		||||
     inkscape:cx="-10.001409"
 | 
			
		||||
     inkscape:cy="24.512566"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="true"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1002.3622)">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4249"
 | 
			
		||||
       width="1"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       x="9.5"
 | 
			
		||||
       y="1008.8622"
 | 
			
		||||
       ry="1.7382812e-05" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="1.7382812e-05"
 | 
			
		||||
       y="1013.8622"
 | 
			
		||||
       x="9.5"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       width="1"
 | 
			
		||||
       id="rect4255"
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="1.7382812e-05"
 | 
			
		||||
       y="1008.8622"
 | 
			
		||||
       x="4.5"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       width="1"
 | 
			
		||||
       id="rect4261"
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4263"
 | 
			
		||||
       width="1"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       x="4.5"
 | 
			
		||||
       y="1013.8622"
 | 
			
		||||
       ry="1.7382812e-05" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="1.7382812e-05"
 | 
			
		||||
       y="1039.8622"
 | 
			
		||||
       x="9.5"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       width="1"
 | 
			
		||||
       id="rect4265"
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4267"
 | 
			
		||||
       width="1"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       x="9.5"
 | 
			
		||||
       y="1044.8622"
 | 
			
		||||
       ry="1.7382812e-05" />
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4269"
 | 
			
		||||
       width="1"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       x="4.5"
 | 
			
		||||
       y="1039.8622"
 | 
			
		||||
       ry="1.7382812e-05" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="1.7382812e-05"
 | 
			
		||||
       y="1044.8622"
 | 
			
		||||
       x="4.5"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       width="1"
 | 
			
		||||
       id="rect4271"
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4273"
 | 
			
		||||
       width="1"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       x="9.5"
 | 
			
		||||
       y="1018.8622"
 | 
			
		||||
       ry="1.7382812e-05" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="1.7382812e-05"
 | 
			
		||||
       y="1018.8622"
 | 
			
		||||
       x="4.5"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       width="1"
 | 
			
		||||
       id="rect4275"
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4277"
 | 
			
		||||
       width="1"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       x="9.5"
 | 
			
		||||
       y="1034.8622"
 | 
			
		||||
       ry="1.7382812e-05" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="1.7382812e-05"
 | 
			
		||||
       y="1034.8622"
 | 
			
		||||
       x="4.5"
 | 
			
		||||
       height="1.0000174"
 | 
			
		||||
       width="1"
 | 
			
		||||
       id="rect4279"
 | 
			
		||||
       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.2 KiB  | 
							
								
								
									
										42
									
								
								static/js/novnc/app/images/icons/Makefile
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
ICONS := \
 | 
			
		||||
	novnc-16x16.png \
 | 
			
		||||
	novnc-24x24.png \
 | 
			
		||||
	novnc-32x32.png \
 | 
			
		||||
	novnc-48x48.png \
 | 
			
		||||
	novnc-64x64.png
 | 
			
		||||
 | 
			
		||||
ANDROID_LAUNCHER := \
 | 
			
		||||
	novnc-48x48.png \
 | 
			
		||||
	novnc-72x72.png \
 | 
			
		||||
	novnc-96x96.png \
 | 
			
		||||
	novnc-144x144.png \
 | 
			
		||||
	novnc-192x192.png
 | 
			
		||||
 | 
			
		||||
IPHONE_LAUNCHER := \
 | 
			
		||||
	novnc-60x60.png \
 | 
			
		||||
	novnc-120x120.png
 | 
			
		||||
 | 
			
		||||
IPAD_LAUNCHER := \
 | 
			
		||||
	novnc-76x76.png \
 | 
			
		||||
	novnc-152x152.png
 | 
			
		||||
 | 
			
		||||
ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER)
 | 
			
		||||
 | 
			
		||||
all: $(ALL_ICONS)
 | 
			
		||||
 | 
			
		||||
novnc-16x16.png: novnc-icon-sm.svg
 | 
			
		||||
	convert -density 90 \
 | 
			
		||||
		-background transparent "$<" "$@"
 | 
			
		||||
novnc-24x24.png: novnc-icon-sm.svg
 | 
			
		||||
	convert -density 135 \
 | 
			
		||||
		-background transparent "$<" "$@"
 | 
			
		||||
novnc-32x32.png: novnc-icon-sm.svg
 | 
			
		||||
	convert -density 180 \
 | 
			
		||||
		-background transparent "$<" "$@"
 | 
			
		||||
 | 
			
		||||
novnc-%.png: novnc-icon.svg
 | 
			
		||||
	convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \
 | 
			
		||||
		-background transparent "$<" "$@"
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -f *.png
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-120x120.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-144x144.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-152x152.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-16x16.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 675 B  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-192x192.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-24x24.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1,000 B  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-32x32.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-48x48.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-60x60.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-64x64.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-72x72.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-76x76.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-96x96.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.3 KiB  | 
							
								
								
									
										163
									
								
								static/js/novnc/app/images/icons/novnc-icon-sm.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,163 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="16"
 | 
			
		||||
   height="16"
 | 
			
		||||
   viewBox="0 0 16 16"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="novnc-icon-sm.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#ffffff"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0.0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="45.254834"
 | 
			
		||||
     inkscape:cx="9.722703"
 | 
			
		||||
     inkscape:cy="5.5311896"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:snap-midpoints="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4169" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1036.3621)">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4167"
 | 
			
		||||
       width="16"
 | 
			
		||||
       height="15.999992"
 | 
			
		||||
       x="0"
 | 
			
		||||
       y="1036.3622"
 | 
			
		||||
       ry="2.6666584" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="M 2.6666667,1036.3621 C 1.1893373,1036.3621 0,1037.5515 0,1039.0288 l 0,10.6666 c 0,1.4774 1.1893373,2.6667 2.6666667,2.6667 l 4,0 C 11.837333,1052.3621 16,1046.7128 16,1039.6955 l 0,-0.6667 c 0,-1.4773 -1.189337,-2.6667 -2.666667,-2.6667 l -10.6666663,0 z"
 | 
			
		||||
       id="rect4173"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
    <g
 | 
			
		||||
       id="g4381">
 | 
			
		||||
      <g
 | 
			
		||||
         transform="translate(0.25,0.25)"
 | 
			
		||||
         style="fill:#000000;fill-opacity:1"
 | 
			
		||||
         id="g4365">
 | 
			
		||||
        <g
 | 
			
		||||
           style="fill:#000000;fill-opacity:1"
 | 
			
		||||
           id="g4367">
 | 
			
		||||
          <path
 | 
			
		||||
             inkscape:connector-curvature="0"
 | 
			
		||||
             id="path4369"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 C 2.011349,1040.3621 2,1040.3741 2,1040.3981 l 0,2.964 -1,0 0,-4 z"
 | 
			
		||||
             sodipodi:nodetypes="scsccsssscccs" />
 | 
			
		||||
          <path
 | 
			
		||||
             inkscape:connector-curvature="0"
 | 
			
		||||
             id="path4371"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
 | 
			
		||||
             sodipodi:nodetypes="sscsscsscsscssssssssss" />
 | 
			
		||||
        </g>
 | 
			
		||||
        <g
 | 
			
		||||
           style="fill:#000000;fill-opacity:1"
 | 
			
		||||
           id="g4373">
 | 
			
		||||
          <path
 | 
			
		||||
             inkscape:connector-curvature="0"
 | 
			
		||||
             id="path4375"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
 | 
			
		||||
             sodipodi:nodetypes="cccccccc" />
 | 
			
		||||
          <path
 | 
			
		||||
             inkscape:connector-curvature="0"
 | 
			
		||||
             id="path4377"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
 | 
			
		||||
             sodipodi:nodetypes="ccccccccccc" />
 | 
			
		||||
          <path
 | 
			
		||||
             inkscape:connector-curvature="0"
 | 
			
		||||
             id="path4379"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
 | 
			
		||||
             sodipodi:nodetypes="cssssccscsscscc" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         id="g4356">
 | 
			
		||||
        <g
 | 
			
		||||
           id="g4347">
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="scsccsssscccs"
 | 
			
		||||
             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 c -0.022689,0 -0.034038,0.012 -0.034038,0.036 l 0,2.964 -1,0 0,-4 z"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             id="path4143"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="sscsscsscsscssssssssss"
 | 
			
		||||
             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             id="path4145"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
        </g>
 | 
			
		||||
        <g
 | 
			
		||||
           id="g4351">
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="cccccccc"
 | 
			
		||||
             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             id="path4147"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="ccccccccccc"
 | 
			
		||||
             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             id="path4149"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="cssssccscsscscc"
 | 
			
		||||
             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
 | 
			
		||||
             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
             id="path4151"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										163
									
								
								static/js/novnc/app/images/icons/novnc-icon.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,163 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="48"
 | 
			
		||||
   height="48"
 | 
			
		||||
   viewBox="0 0 48 48.000001"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="novnc-icon.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#ffffff"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0.0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="11.313708"
 | 
			
		||||
     inkscape:cx="27.187245"
 | 
			
		||||
     inkscape:cy="17.700974"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:snap-midpoints="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4169" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title />
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1004.3621)">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       id="rect4167"
 | 
			
		||||
       width="48"
 | 
			
		||||
       height="48"
 | 
			
		||||
       x="0"
 | 
			
		||||
       y="1004.3621"
 | 
			
		||||
       ry="7.9999785" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="m 8,1004.3621 c -4.4319881,0 -8,3.568 -8,8 l 0,32 c 0,4.432 3.5680119,8 8,8 l 12,0 c 15.512,0 28,-16.948 28,-38 l 0,-2 c 0,-4.432 -3.568012,-8 -8,-8 l -32,0 z"
 | 
			
		||||
       id="rect4173"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
    <g
 | 
			
		||||
       id="g4300"
 | 
			
		||||
       style="fill:#000000;fill-opacity:1;stroke:none"
 | 
			
		||||
       transform="translate(0.5,0.5)">
 | 
			
		||||
      <g
 | 
			
		||||
         id="g4302"
 | 
			
		||||
         style="fill:#000000;fill-opacity:1;stroke:none">
 | 
			
		||||
        <path
 | 
			
		||||
           sodipodi:nodetypes="scsccsssscccs"
 | 
			
		||||
           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           id="path4304"
 | 
			
		||||
           inkscape:connector-curvature="0" />
 | 
			
		||||
        <path
 | 
			
		||||
           sodipodi:nodetypes="sscsscsscsscssssssssss"
 | 
			
		||||
           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           id="path4306"
 | 
			
		||||
           inkscape:connector-curvature="0" />
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         id="g4308"
 | 
			
		||||
         style="fill:#000000;fill-opacity:1;stroke:none">
 | 
			
		||||
        <path
 | 
			
		||||
           sodipodi:nodetypes="cccccccc"
 | 
			
		||||
           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           id="path4310"
 | 
			
		||||
           inkscape:connector-curvature="0" />
 | 
			
		||||
        <path
 | 
			
		||||
           sodipodi:nodetypes="ccccccccccc"
 | 
			
		||||
           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           id="path4312"
 | 
			
		||||
           inkscape:connector-curvature="0" />
 | 
			
		||||
        <path
 | 
			
		||||
           sodipodi:nodetypes="cssssccscsscscc"
 | 
			
		||||
           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           id="path4314"
 | 
			
		||||
           inkscape:connector-curvature="0" />
 | 
			
		||||
      </g>
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g4291"
 | 
			
		||||
       style="stroke:none">
 | 
			
		||||
      <g
 | 
			
		||||
         id="g4282"
 | 
			
		||||
         style="stroke:none">
 | 
			
		||||
        <path
 | 
			
		||||
           inkscape:connector-curvature="0"
 | 
			
		||||
           id="path4143"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
 | 
			
		||||
           sodipodi:nodetypes="scsccsssscccs" />
 | 
			
		||||
        <path
 | 
			
		||||
           inkscape:connector-curvature="0"
 | 
			
		||||
           id="path4145"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
 | 
			
		||||
           sodipodi:nodetypes="sscsscsscsscssssssssss" />
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         id="g4286"
 | 
			
		||||
         style="stroke:none">
 | 
			
		||||
        <path
 | 
			
		||||
           inkscape:connector-curvature="0"
 | 
			
		||||
           id="path4147"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
 | 
			
		||||
           sodipodi:nodetypes="cccccccc" />
 | 
			
		||||
        <path
 | 
			
		||||
           inkscape:connector-curvature="0"
 | 
			
		||||
           id="path4149"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
 | 
			
		||||
           sodipodi:nodetypes="ccccccccccc" />
 | 
			
		||||
        <path
 | 
			
		||||
           inkscape:connector-curvature="0"
 | 
			
		||||
           id="path4151"
 | 
			
		||||
           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
 | 
			
		||||
           sodipodi:nodetypes="cssssccscsscscc" />
 | 
			
		||||
      </g>
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										81
									
								
								static/js/novnc/app/images/info.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,81 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="info.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="15.720838"
 | 
			
		||||
     inkscape:cy="8.9111233"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title />
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="M 12.5 3 A 9.5 9.4999914 0 0 0 3 12.5 A 9.5 9.4999914 0 0 0 12.5 22 A 9.5 9.4999914 0 0 0 22 12.5 A 9.5 9.4999914 0 0 0 12.5 3 z M 12.5 5 A 1.5 1.5000087 0 0 1 14 6.5 A 1.5 1.5000087 0 0 1 12.5 8 A 1.5 1.5000087 0 0 1 11 6.5 A 1.5 1.5000087 0 0 1 12.5 5 z M 10.521484 8.9785156 L 12.521484 8.9785156 A 1.50015 1.50015 0 0 1 14.021484 10.478516 L 14.021484 15.972656 A 1.50015 1.50015 0 0 1 14.498047 18.894531 C 14.498047 18.894531 13.74301 19.228309 12.789062 18.912109 C 12.312092 18.754109 11.776235 18.366625 11.458984 17.828125 C 11.141734 17.289525 11.021484 16.668469 11.021484 15.980469 L 11.021484 11.980469 L 10.521484 11.980469 A 1.50015 1.50015 0 1 1 10.521484 8.9804688 L 10.521484 8.9785156 z "
 | 
			
		||||
       transform="translate(0,1027.3622)"
 | 
			
		||||
       id="path4136" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.1 KiB  | 
							
								
								
									
										88
									
								
								static/js/novnc/app/images/keyboard.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="keyboard.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/keyboard.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#717171"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="31.285341"
 | 
			
		||||
     inkscape:cy="8.8028469"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:snap-bbox-midpoints="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-midpoints="true"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title />
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="M 7,3 C 4.8012876,3 3,4.8013 3,7 3,11.166667 3,15.333333 3,19.5 3,20.8764 4.1236413,22 5.5,22 l 14,0 C 20.876358,22 22,20.8764 22,19.5 22,15.333333 22,11.166667 22,7 22,4.8013 20.198712,3 18,3 Z m 0,2 11,0 c 1.125307,0 2,0.8747 2,2 L 20,12 5,12 5,7 C 5,5.8747 5.8746931,5 7,5 Z M 6.5,14 C 6.777,14 7,14.223 7,14.5 7,14.777 6.777,15 6.5,15 6.223,15 6,14.777 6,14.5 6,14.223 6.223,14 6.5,14 Z m 2,0 C 8.777,14 9,14.223 9,14.5 9,14.777 8.777,15 8.5,15 8.223,15 8,14.777 8,14.5 8,14.223 8.223,14 8.5,14 Z m 2,0 C 10.777,14 11,14.223 11,14.5 11,14.777 10.777,15 10.5,15 10.223,15 10,14.777 10,14.5 10,14.223 10.223,14 10.5,14 Z m 2,0 C 12.777,14 13,14.223 13,14.5 13,14.777 12.777,15 12.5,15 12.223,15 12,14.777 12,14.5 12,14.223 12.223,14 12.5,14 Z m 2,0 C 14.777,14 15,14.223 15,14.5 15,14.777 14.777,15 14.5,15 14.223,15 14,14.777 14,14.5 14,14.223 14.223,14 14.5,14 Z m 2,0 C 16.777,14 17,14.223 17,14.5 17,14.777 16.777,15 16.5,15 16.223,15 16,14.777 16,14.5 16,14.223 16.223,14 16.5,14 Z m 2,0 C 18.777,14 19,14.223 19,14.5 19,14.777 18.777,15 18.5,15 18.223,15 18,14.777 18,14.5 18,14.223 18.223,14 18.5,14 Z m -13,2 C 5.777,16 6,16.223 6,16.5 6,16.777 5.777,17 5.5,17 5.223,17 5,16.777 5,16.5 5,16.223 5.223,16 5.5,16 Z m 2,0 C 7.777,16 8,16.223 8,16.5 8,16.777 7.777,17 7.5,17 7.223,17 7,16.777 7,16.5 7,16.223 7.223,16 7.5,16 Z m 2,0 C 9.777,16 10,16.223 10,16.5 10,16.777 9.777,17 9.5,17 9.223,17 9,16.777 9,16.5 9,16.223 9.223,16 9.5,16 Z m 2,0 C 11.777,16 12,16.223 12,16.5 12,16.777 11.777,17 11.5,17 11.223,17 11,16.777 11,16.5 11,16.223 11.223,16 11.5,16 Z m 2,0 C 13.777,16 14,16.223 14,16.5 14,16.777 13.777,17 13.5,17 13.223,17 13,16.777 13,16.5 13,16.223 13.223,16 13.5,16 Z m 2,0 C 15.777,16 16,16.223 16,16.5 16,16.777 15.777,17 15.5,17 15.223,17 15,16.777 15,16.5 15,16.223 15.223,16 15.5,16 Z m 2,0 C 17.777,16 18,16.223 18,16.5 18,16.777 17.777,17 17.5,17 17.223,17 17,16.777 17,16.5 17,16.223 17.223,16 17.5,16 Z m 2,0 C 19.777,16 20,16.223 20,16.5 20,16.777 19.777,17 19.5,17 19.223,17 19,16.777 19,16.5 19,16.223 19.223,16 19.5,16 Z M 6,18 c 0.554,0 1,0.446 1,1 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 0,-0.554 0.446,-1 1,-1 z m 2.8261719,0 7.3476561,0 C 16.631643,18 17,18.368372 17,18.826172 l 0,0.347656 C 17,19.631628 16.631643,20 16.173828,20 L 8.8261719,20 C 8.3683573,20 8,19.631628 8,19.173828 L 8,18.826172 C 8,18.368372 8.3683573,18 8.8261719,18 Z m 10.1113281,0 0.125,0 C 19.581551,18 20,18.4184 20,18.9375 l 0,0.125 C 20,19.5816 19.581551,20 19.0625,20 l -0.125,0 C 18.418449,20 18,19.5816 18,19.0625 l 0,-0.125 C 18,18.4184 18.418449,18 18.9375,18 Z"
 | 
			
		||||
       transform="translate(0,1027.3622)"
 | 
			
		||||
       id="rect4160"
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       sodipodi:nodetypes="sccssccsssssccssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
 | 
			
		||||
       d="m 12.499929,1033.8622 -2,2 1.500071,0 0,2 1,0 0,-2 1.499929,0 z"
 | 
			
		||||
       id="path4150"
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       sodipodi:nodetypes="cccccccc" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.3 KiB  | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_left.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="mouse_left.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="11.313708"
 | 
			
		||||
     inkscape:cx="15.551515"
 | 
			
		||||
     inkscape:cy="12.205592"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
 | 
			
		||||
       id="path6219" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
 | 
			
		||||
       id="path6217" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
 | 
			
		||||
       id="path6215" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
 | 
			
		||||
       id="rect6178" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.8 KiB  | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_middle.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="mouse_middle.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="11.313708"
 | 
			
		||||
     inkscape:cx="15.551515"
 | 
			
		||||
     inkscape:cy="12.205592"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
 | 
			
		||||
       id="path6219" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
 | 
			
		||||
       id="path6217" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
 | 
			
		||||
       id="path6215" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
 | 
			
		||||
       id="rect6178" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.8 KiB  | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_none.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="mouse_none.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="16"
 | 
			
		||||
     inkscape:cx="23.160825"
 | 
			
		||||
     inkscape:cy="13.208262"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
 | 
			
		||||
       id="path6219" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
 | 
			
		||||
       id="path6217" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
 | 
			
		||||
       id="path6215" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
 | 
			
		||||
       id="rect6178" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.8 KiB  | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_right.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="mouse_right.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="11.313708"
 | 
			
		||||
     inkscape:cx="15.551515"
 | 
			
		||||
     inkscape:cy="12.205592"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
 | 
			
		||||
       id="path6219" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
 | 
			
		||||
       id="path6217" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
 | 
			
		||||
       id="path6215" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
 | 
			
		||||
       id="rect6178" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 6.8 KiB  | 
							
								
								
									
										87
									
								
								static/js/novnc/app/images/power.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,87 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="power.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="9.3159849"
 | 
			
		||||
     inkscape:cy="13.436208"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="M 9 6.8183594 C 6.3418164 8.1213032 4.5 10.849161 4.5 14 C 4.5 18.4065 8.0935666 22 12.5 22 C 16.906433 22 20.5 18.4065 20.5 14 C 20.5 10.849161 18.658184 8.1213032 16 6.8183594 L 16 9.125 C 17.514327 10.211757 18.5 11.984508 18.5 14 C 18.5 17.3256 15.825553 20 12.5 20 C 9.1744469 20 6.5 17.3256 6.5 14 C 6.5 11.984508 7.4856727 10.211757 9 9.125 L 9 6.8183594 z "
 | 
			
		||||
       transform="translate(0,1027.3622)"
 | 
			
		||||
       id="path6140" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 | 
			
		||||
       d="m 12.5,1031.8836 0,6.4786"
 | 
			
		||||
       id="path6142"
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       sodipodi:nodetypes="cc" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.9 KiB  | 
							
								
								
									
										76
									
								
								static/js/novnc/app/images/settings.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="settings.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="22.627417"
 | 
			
		||||
     inkscape:cx="14.69683"
 | 
			
		||||
     inkscape:cy="8.8039511"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="true"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="M 11 3 L 11 5.1601562 A 7.5 7.5 0 0 0 8.3671875 6.2460938 L 6.84375 4.7226562 L 4.7226562 6.84375 L 6.2480469 8.3691406 A 7.5 7.5 0 0 0 5.1523438 11 L 3 11 L 3 14 L 5.1601562 14 A 7.5 7.5 0 0 0 6.2460938 16.632812 L 4.7226562 18.15625 L 6.84375 20.277344 L 8.3691406 18.751953 A 7.5 7.5 0 0 0 11 19.847656 L 11 22 L 14 22 L 14 19.839844 A 7.5 7.5 0 0 0 16.632812 18.753906 L 18.15625 20.277344 L 20.277344 18.15625 L 18.751953 16.630859 A 7.5 7.5 0 0 0 19.847656 14 L 22 14 L 22 11 L 19.839844 11 A 7.5 7.5 0 0 0 18.753906 8.3671875 L 20.277344 6.84375 L 18.15625 4.7226562 L 16.630859 6.2480469 A 7.5 7.5 0 0 0 14 5.1523438 L 14 3 L 11 3 z M 12.5 10 A 2.5 2.5 0 0 1 15 12.5 A 2.5 2.5 0 0 1 12.5 15 A 2.5 2.5 0 0 1 10 12.5 A 2.5 2.5 0 0 1 12.5 10 z "
 | 
			
		||||
       transform="translate(0,1027.3622)"
 | 
			
		||||
       id="rect4967" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3 KiB  | 
							
								
								
									
										86
									
								
								static/js/novnc/app/images/tab.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,86 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="tab.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="16"
 | 
			
		||||
     inkscape:cx="11.67335"
 | 
			
		||||
     inkscape:cy="17.881696"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="true"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       d="m 3,1031.3622 0,8 2,0 0,-4 0,-4 -2,0 z m 2,4 4,4 0,-3 13,0 0,-2 -13,0 0,-3 -4,4 z"
 | 
			
		||||
       id="rect5194"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
    <path
 | 
			
		||||
       id="path5211"
 | 
			
		||||
       d="m 22,1048.3622 0,-8 -2,0 0,4 0,4 2,0 z m -2,-4 -4,-4 0,3 -13,0 0,2 13,0 0,3 4,-4 z"
 | 
			
		||||
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
 | 
			
		||||
       inkscape:connector-curvature="0" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 2.9 KiB  | 
							
								
								
									
										90
									
								
								static/js/novnc/app/images/toggleextrakeys.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,90 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="extrakeys.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="15.234555"
 | 
			
		||||
     inkscape:cy="9.9710826"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="m 8,1031.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,8.9996 c 0,2.1987 1.8012876,4 4,4 l 9,0 c 2.198712,0 4,-1.8013 4,-4 l 0,-8.9996 c 0,-2.1987 -1.801288,-4 -4,-4 z m 0,2 9,0 c 1.125307,0 2,0.8747 2,2 l 0,7.0005 c 0,1.1253 -0.874693,2 -2,2 l -9,0 c -1.1253069,0 -2,-0.8747 -2,-2 l 0,-7.0005 c 0,-1.1253 0.8746931,-2 2,-2 z"
 | 
			
		||||
       id="rect5006"
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       sodipodi:nodetypes="ssssssssssssssssss" />
 | 
			
		||||
    <g
 | 
			
		||||
       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
 | 
			
		||||
       id="text4167"
 | 
			
		||||
       transform="matrix(0.96021948,0,0,0.96021948,0.18921715,41.80659)">
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 14.292969,1040.6791 -2.939453,0 -0.463868,1.3281 -1.889648,0 2.700195,-7.29 2.241211,0 2.700196,7.29 -1.889649,0 -0.458984,-1.3281 z m -2.470703,-1.3526 1.99707,0 -0.996094,-2.9004 -1.000976,2.9004 z"
 | 
			
		||||
         id="path4172"
 | 
			
		||||
         inkscape:connector-curvature="0" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 4.3 KiB  | 
							
								
								
									
										81
									
								
								static/js/novnc/app/images/warning.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,81 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="25"
 | 
			
		||||
   height="25"
 | 
			
		||||
   viewBox="0 0 25 25"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="warning.svg"
 | 
			
		||||
   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
 | 
			
		||||
   inkscape:export-xdpi="90"
 | 
			
		||||
   inkscape:export-ydpi="90">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#959595"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="16.457343"
 | 
			
		||||
     inkscape:cy="12.179552"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:bbox-nodes="true"
 | 
			
		||||
     inkscape:snap-bbox-edge-midpoints="true"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     showguides="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1136"
 | 
			
		||||
     inkscape:window-x="1920"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="true"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-global="true">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4136" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata7">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-1027.3622)">
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
 | 
			
		||||
       d="M 12.513672 3.0019531 C 11.751609 2.9919531 11.052563 3.4242687 10.710938 4.1054688 L 3.2109375 19.105469 C 2.5461937 20.435369 3.5132277 21.9999 5 22 L 20 22 C 21.486772 21.9999 22.453806 20.435369 21.789062 19.105469 L 14.289062 4.1054688 C 13.951849 3.4330688 13.265888 3.0066531 12.513672 3.0019531 z M 12.478516 6.9804688 A 1.50015 1.50015 0 0 1 14 8.5 L 14 14.5 A 1.50015 1.50015 0 1 1 11 14.5 L 11 8.5 A 1.50015 1.50015 0 0 1 12.478516 6.9804688 z M 12.5 17 A 1.5 1.5 0 0 1 14 18.5 A 1.5 1.5 0 0 1 12.5 20 A 1.5 1.5 0 0 1 11 18.5 A 1.5 1.5 0 0 1 12.5 17 z "
 | 
			
		||||
       transform="translate(0,1027.3622)"
 | 
			
		||||
       id="path4208" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.8 KiB  | 
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/de.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "Verbinden...",
 | 
			
		||||
    "Disconnecting...": "Verbindung trennen...",
 | 
			
		||||
    "Reconnecting...": "Verbindung wiederherstellen...",
 | 
			
		||||
    "Internal error": "Interner Fehler",
 | 
			
		||||
    "Must set host": "Richten Sie den Server ein",
 | 
			
		||||
    "Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
 | 
			
		||||
    "Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
 | 
			
		||||
    "Something went wrong, connection is closed": "Etwas lief schief, Verbindung wurde getrennt",
 | 
			
		||||
    "Disconnected": "Verbindung zum Server getrennt",
 | 
			
		||||
    "New connection has been rejected with reason: ": "Verbindung wurde aus folgendem Grund abgelehnt: ",
 | 
			
		||||
    "New connection has been rejected": "Verbindung wurde abgelehnt",
 | 
			
		||||
    "Password is required": "Passwort ist erforderlich",
 | 
			
		||||
    "noVNC encountered an error:": "Ein Fehler ist aufgetreten:",
 | 
			
		||||
    "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen",
 | 
			
		||||
    "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen",
 | 
			
		||||
    "viewport drag": "Ansichtsfenster ziehen",
 | 
			
		||||
    "Active Mouse Button": "Aktive Maustaste",
 | 
			
		||||
    "No mousebutton": "Keine Maustaste",
 | 
			
		||||
    "Left mousebutton": "Linke Maustaste",
 | 
			
		||||
    "Middle mousebutton": "Mittlere Maustaste",
 | 
			
		||||
    "Right mousebutton": "Rechte Maustaste",
 | 
			
		||||
    "Keyboard": "Tastatur",
 | 
			
		||||
    "Show Keyboard": "Tastatur anzeigen",
 | 
			
		||||
    "Extra keys": "Zusatztasten",
 | 
			
		||||
    "Show Extra Keys": "Zusatztasten anzeigen",
 | 
			
		||||
    "Ctrl": "Strg",
 | 
			
		||||
    "Toggle Ctrl": "Strg umschalten",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "Alt umschalten",
 | 
			
		||||
    "Send Tab": "Tab senden",
 | 
			
		||||
    "Tab": "Tab",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "Escape senden",
 | 
			
		||||
    "Ctrl+Alt+Del": "Strg+Alt+Entf",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "Strg+Alt+Entf senden",
 | 
			
		||||
    "Shutdown/Reboot": "Herunterfahren/Neustarten",
 | 
			
		||||
    "Shutdown/Reboot...": "Herunterfahren/Neustarten...",
 | 
			
		||||
    "Power": "Energie",
 | 
			
		||||
    "Shutdown": "Herunterfahren",
 | 
			
		||||
    "Reboot": "Neustarten",
 | 
			
		||||
    "Reset": "Zurücksetzen",
 | 
			
		||||
    "Clipboard": "Zwischenablage",
 | 
			
		||||
    "Clear": "Löschen",
 | 
			
		||||
    "Fullscreen": "Vollbild",
 | 
			
		||||
    "Settings": "Einstellungen",
 | 
			
		||||
    "Shared Mode": "Geteilter Modus",
 | 
			
		||||
    "View Only": "Nur betrachten",
 | 
			
		||||
    "Clip to Window": "Auf Fenster begrenzen",
 | 
			
		||||
    "Scaling Mode:": "Skalierungsmodus:",
 | 
			
		||||
    "None": "Keiner",
 | 
			
		||||
    "Local Scaling": "Lokales skalieren",
 | 
			
		||||
    "Remote Resizing": "Serverseitiges skalieren",
 | 
			
		||||
    "Advanced": "Erweitert",
 | 
			
		||||
    "Repeater ID:": "Repeater ID:",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "Verschlüsselt",
 | 
			
		||||
    "Host:": "Server:",
 | 
			
		||||
    "Port:": "Port:",
 | 
			
		||||
    "Path:": "Pfad:",
 | 
			
		||||
    "Automatic Reconnect": "Automatisch wiederverbinden",
 | 
			
		||||
    "Reconnect Delay (ms):": "Wiederverbindungsverzögerung (ms):",
 | 
			
		||||
    "Logging:": "Protokollierung:",
 | 
			
		||||
    "Disconnect": "Verbindung trennen",
 | 
			
		||||
    "Connect": "Verbinden",
 | 
			
		||||
    "Password:": "Passwort:",
 | 
			
		||||
    "Cancel": "Abbrechen",
 | 
			
		||||
    "Canvas not supported.": "Canvas nicht unterstützt."
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/el.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "Συνδέεται...",
 | 
			
		||||
    "Disconnecting...": "Aποσυνδέεται...",
 | 
			
		||||
    "Reconnecting...": "Επανασυνδέεται...",
 | 
			
		||||
    "Internal error": "Εσωτερικό σφάλμα",
 | 
			
		||||
    "Must set host": "Πρέπει να οριστεί ο διακομιστής",
 | 
			
		||||
    "Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
 | 
			
		||||
    "Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
 | 
			
		||||
    "Something went wrong, connection is closed": "Κάτι πήγε στραβά, η σύνδεση διακόπηκε",
 | 
			
		||||
    "Disconnected": "Αποσυνδέθηκε",
 | 
			
		||||
    "New connection has been rejected with reason: ": "Η νέα σύνδεση απορρίφθηκε διότι: ",
 | 
			
		||||
    "New connection has been rejected": "Η νέα σύνδεση απορρίφθηκε ",
 | 
			
		||||
    "Password is required": "Απαιτείται ο κωδικός πρόσβασης",
 | 
			
		||||
    "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:",
 | 
			
		||||
    "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου",
 | 
			
		||||
    "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου",
 | 
			
		||||
    "viewport drag": "σύρσιμο θεατού πεδίου",
 | 
			
		||||
    "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού",
 | 
			
		||||
    "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού",
 | 
			
		||||
    "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού",
 | 
			
		||||
    "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού",
 | 
			
		||||
    "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού",
 | 
			
		||||
    "Keyboard": "Πληκτρολόγιο",
 | 
			
		||||
    "Show Keyboard": "Εμφάνιση Πληκτρολογίου",
 | 
			
		||||
    "Extra keys": "Επιπλέον πλήκτρα",
 | 
			
		||||
    "Show Extra Keys": "Εμφάνιση Επιπλέον Πλήκτρων",
 | 
			
		||||
    "Ctrl": "Ctrl",
 | 
			
		||||
    "Toggle Ctrl": "Εναλλαγή Ctrl",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "Εναλλαγή Alt",
 | 
			
		||||
    "Send Tab": "Αποστολή Tab",
 | 
			
		||||
    "Tab": "Tab",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "Αποστολή Escape",
 | 
			
		||||
    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "Αποστολή Ctrl-Alt-Del",
 | 
			
		||||
    "Shutdown/Reboot": "Κλείσιμο/Επανεκκίνηση",
 | 
			
		||||
    "Shutdown/Reboot...": "Κλείσιμο/Επανεκκίνηση...",
 | 
			
		||||
    "Power": "Απενεργοποίηση",
 | 
			
		||||
    "Shutdown": "Κλείσιμο",
 | 
			
		||||
    "Reboot": "Επανεκκίνηση",
 | 
			
		||||
    "Reset": "Επαναφορά",
 | 
			
		||||
    "Clipboard": "Πρόχειρο",
 | 
			
		||||
    "Clear": "Καθάρισμα",
 | 
			
		||||
    "Fullscreen": "Πλήρης Οθόνη",
 | 
			
		||||
    "Settings": "Ρυθμίσεις",
 | 
			
		||||
    "Shared Mode": "Κοινόχρηστη Λειτουργία",
 | 
			
		||||
    "View Only": "Μόνο Θέαση",
 | 
			
		||||
    "Clip to Window": "Αποκοπή στο όριο του Παράθυρου",
 | 
			
		||||
    "Scaling Mode:": "Λειτουργία Κλιμάκωσης:",
 | 
			
		||||
    "None": "Καμία",
 | 
			
		||||
    "Local Scaling": "Τοπική Κλιμάκωση",
 | 
			
		||||
    "Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους",
 | 
			
		||||
    "Advanced": "Για προχωρημένους",
 | 
			
		||||
    "Repeater ID:": "Repeater ID:",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "Κρυπτογράφηση",
 | 
			
		||||
    "Host:": "Όνομα διακομιστή:",
 | 
			
		||||
    "Port:": "Πόρτα διακομιστή:",
 | 
			
		||||
    "Path:": "Διαδρομή:",
 | 
			
		||||
    "Automatic Reconnect": "Αυτόματη επανασύνδεση",
 | 
			
		||||
    "Reconnect Delay (ms):": "Καθυστέρηση επανασύνδεσης (ms):",
 | 
			
		||||
    "Logging:": "Καταγραφή:",
 | 
			
		||||
    "Disconnect": "Αποσύνδεση",
 | 
			
		||||
    "Connect": "Σύνδεση",
 | 
			
		||||
    "Password:": "Κωδικός Πρόσβασης:",
 | 
			
		||||
    "Cancel": "Ακύρωση",
 | 
			
		||||
    "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								static/js/novnc/app/locale/es.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "Conectando...",
 | 
			
		||||
    "Connected (encrypted) to ": "Conectado (con encriptación) a",
 | 
			
		||||
    "Connected (unencrypted) to ": "Conectado (sin encriptación) a",
 | 
			
		||||
    "Disconnecting...": "Desconectando...",
 | 
			
		||||
    "Disconnected": "Desconectado",
 | 
			
		||||
    "Must set host": "Debes configurar el host",
 | 
			
		||||
    "Reconnecting...": "Reconectando...",
 | 
			
		||||
    "Password is required": "Contraseña es obligatoria",
 | 
			
		||||
    "Disconnect timeout": "Tiempo de desconexión agotado",
 | 
			
		||||
    "noVNC encountered an error:": "noVNC ha encontrado un error:",
 | 
			
		||||
    "Hide/Show the control bar": "Ocultar/Mostrar la barra de control",
 | 
			
		||||
    "Move/Drag Viewport": "Mover/Arrastrar la ventana",
 | 
			
		||||
    "viewport drag": "Arrastrar la ventana",
 | 
			
		||||
    "Active Mouse Button": "Botón activo del ratón",
 | 
			
		||||
    "No mousebutton": "Ningún botón del ratón",
 | 
			
		||||
    "Left mousebutton": "Botón izquierdo del ratón",
 | 
			
		||||
    "Middle mousebutton": "Botón central del ratón",
 | 
			
		||||
    "Right mousebutton": "Botón derecho del ratón",
 | 
			
		||||
    "Keyboard": "Teclado",
 | 
			
		||||
    "Show Keyboard": "Mostrar teclado",
 | 
			
		||||
    "Extra keys": "Teclas adicionales",
 | 
			
		||||
    "Show Extra Keys": "Mostrar Teclas Adicionales",
 | 
			
		||||
    "Ctrl": "Ctrl",
 | 
			
		||||
    "Toggle Ctrl": "Pulsar/Soltar Ctrl",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "Pulsar/Soltar Alt",
 | 
			
		||||
    "Send Tab": "Enviar Tabulación",
 | 
			
		||||
    "Tab": "Tabulación",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "Enviar Escape",
 | 
			
		||||
    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "Enviar Ctrl+Alt+Del",
 | 
			
		||||
    "Shutdown/Reboot": "Apagar/Reiniciar",
 | 
			
		||||
    "Shutdown/Reboot...": "Apagar/Reiniciar...",
 | 
			
		||||
    "Power": "Encender",
 | 
			
		||||
    "Shutdown": "Apagar",
 | 
			
		||||
    "Reboot": "Reiniciar",
 | 
			
		||||
    "Reset": "Restablecer",
 | 
			
		||||
    "Clipboard": "Portapapeles",
 | 
			
		||||
    "Clear": "Vaciar",
 | 
			
		||||
    "Fullscreen": "Pantalla Completa",
 | 
			
		||||
    "Settings": "Configuraciones",
 | 
			
		||||
    "Shared Mode": "Modo Compartido",
 | 
			
		||||
    "View Only": "Solo visualización",
 | 
			
		||||
    "Clip to Window": "Recortar al tamaño de la ventana",
 | 
			
		||||
    "Scaling Mode:": "Modo de escalado:",
 | 
			
		||||
    "None": "Ninguno",
 | 
			
		||||
    "Local Scaling": "Escalado Local",
 | 
			
		||||
    "Local Downscaling": "Reducción de escala local",
 | 
			
		||||
    "Remote Resizing": "Cambio de tamaño remoto",
 | 
			
		||||
    "Advanced": "Avanzado",
 | 
			
		||||
    "Local Cursor": "Cursor Local",
 | 
			
		||||
    "Repeater ID:": "ID del Repetidor",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "",
 | 
			
		||||
    "Host:": "Host",
 | 
			
		||||
    "Port:": "Puesto",
 | 
			
		||||
    "Path:": "Ruta",
 | 
			
		||||
    "Automatic Reconnect": "Reconexión automática",
 | 
			
		||||
    "Reconnect Delay (ms):": "Retraso en la reconexión (ms)",
 | 
			
		||||
    "Logging:": "Logging",
 | 
			
		||||
    "Disconnect": "Desconectar",
 | 
			
		||||
    "Connect": "Conectar",
 | 
			
		||||
    "Password:": "Contraseña",
 | 
			
		||||
    "Cancel": "Cancelar",
 | 
			
		||||
    "Canvas not supported.": "Canvas no está soportado"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								static/js/novnc/app/locale/nl.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "Verbinden...",
 | 
			
		||||
    "Connected (encrypted) to ": "Verbonden (versleuteld) met ",
 | 
			
		||||
    "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
 | 
			
		||||
    "Disconnecting...": "Verbinding verbreken...",
 | 
			
		||||
    "Disconnected": "Verbinding verbroken",
 | 
			
		||||
    "Must set host": "Host moeten worden ingesteld",
 | 
			
		||||
    "Reconnecting...": "Opnieuw verbinding maken...",
 | 
			
		||||
    "Password is required": "Wachtwoord is vereist",
 | 
			
		||||
    "Disconnect timeout": "Timeout tijdens verbreken van verbinding",
 | 
			
		||||
    "noVNC encountered an error:": "noVNC heeft een fout bemerkt:",
 | 
			
		||||
    "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk",
 | 
			
		||||
    "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster",
 | 
			
		||||
    "viewport drag": "kijkvenster slepen",
 | 
			
		||||
    "Active Mouse Button": "Actieve Muisknop",
 | 
			
		||||
    "No mousebutton": "Geen muisknop",
 | 
			
		||||
    "Left mousebutton": "Linker muisknop",
 | 
			
		||||
    "Middle mousebutton": "Middelste muisknop",
 | 
			
		||||
    "Right mousebutton": "Rechter muisknop",
 | 
			
		||||
    "Keyboard": "Toetsenbord",
 | 
			
		||||
    "Show Keyboard": "Toon Toetsenbord",
 | 
			
		||||
    "Extra keys": "Extra toetsen",
 | 
			
		||||
    "Show Extra Keys": "Toon Extra Toetsen",
 | 
			
		||||
    "Ctrl": "Ctrl",
 | 
			
		||||
    "Toggle Ctrl": "Ctrl aan/uitzetten",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "Alt aan/uitzetten",
 | 
			
		||||
    "Send Tab": "Tab Sturen",
 | 
			
		||||
    "Tab": "Tab",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "Escape Sturen",
 | 
			
		||||
    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Sturen",
 | 
			
		||||
    "Shutdown/Reboot": "Uitschakelen/Herstarten",
 | 
			
		||||
    "Shutdown/Reboot...": "Uitschakelen/Herstarten...",
 | 
			
		||||
    "Power": "Systeem",
 | 
			
		||||
    "Shutdown": "Uitschakelen",
 | 
			
		||||
    "Reboot": "Herstarten",
 | 
			
		||||
    "Reset": "Resetten",
 | 
			
		||||
    "Clipboard": "Klembord",
 | 
			
		||||
    "Clear": "Wissen",
 | 
			
		||||
    "Fullscreen": "Volledig Scherm",
 | 
			
		||||
    "Settings": "Instellingen",
 | 
			
		||||
    "Shared Mode": "Gedeelde Modus",
 | 
			
		||||
    "View Only": "Alleen Kijken",
 | 
			
		||||
    "Clip to Window": "Randen buiten venster afsnijden",
 | 
			
		||||
    "Scaling Mode:": "Schaalmodus:",
 | 
			
		||||
    "None": "Geen",
 | 
			
		||||
    "Local Scaling": "Lokaal Schalen",
 | 
			
		||||
    "Local Downscaling": "Lokaal Neerschalen",
 | 
			
		||||
    "Remote Resizing": "Op Afstand Formaat Wijzigen",
 | 
			
		||||
    "Advanced": "Geavanceerd",
 | 
			
		||||
    "Local Cursor": "Lokale Cursor",
 | 
			
		||||
    "Repeater ID:": "Repeater ID:",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "Versleutelen",
 | 
			
		||||
    "Host:": "Host:",
 | 
			
		||||
    "Port:": "Poort:",
 | 
			
		||||
    "Path:": "Pad:",
 | 
			
		||||
    "Automatic Reconnect": "Automatisch Opnieuw Verbinden",
 | 
			
		||||
    "Reconnect Delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):",
 | 
			
		||||
    "Logging:": "Logmeldingen:",
 | 
			
		||||
    "Disconnect": "Verbinding verbreken",
 | 
			
		||||
    "Connect": "Verbinden",
 | 
			
		||||
    "Password:": "Wachtwoord:",
 | 
			
		||||
    "Cancel": "Annuleren",
 | 
			
		||||
    "Canvas not supported.": "Canvas wordt niet ondersteund."
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/pl.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "Łączenie...",
 | 
			
		||||
    "Disconnecting...": "Rozłączanie...",
 | 
			
		||||
    "Reconnecting...": "Łączenie...",
 | 
			
		||||
    "Internal error": "Błąd wewnętrzny",
 | 
			
		||||
    "Must set host": "Host i port są wymagane",
 | 
			
		||||
    "Connected (encrypted) to ": "Połączenie (szyfrowane) z ",
 | 
			
		||||
    "Connected (unencrypted) to ": "Połączenie (nieszyfrowane) z ",
 | 
			
		||||
    "Something went wrong, connection is closed": "Coś poszło źle, połączenie zostało zamknięte",
 | 
			
		||||
    "Disconnected": "Rozłączony",
 | 
			
		||||
    "New connection has been rejected with reason: ": "Nowe połączenie zostało odrzucone z powodu: ",
 | 
			
		||||
    "New connection has been rejected": "Nowe połączenie zostało odrzucone",
 | 
			
		||||
    "Password is required": "Hasło jest wymagane",
 | 
			
		||||
    "noVNC encountered an error:": "noVNC napotkało błąd:",
 | 
			
		||||
    "Hide/Show the control bar": "Pokaż/Ukryj pasek ustawień",
 | 
			
		||||
    "Move/Drag Viewport": "Ruszaj/Przeciągaj Viewport",
 | 
			
		||||
    "viewport drag": "przeciągnij viewport",
 | 
			
		||||
    "Active Mouse Button": "Aktywny Przycisk Myszy",
 | 
			
		||||
    "No mousebutton": "Brak przycisku myszy",
 | 
			
		||||
    "Left mousebutton": "Lewy przycisk myszy",
 | 
			
		||||
    "Middle mousebutton": "Środkowy przycisk myszy",
 | 
			
		||||
    "Right mousebutton": "Prawy przycisk myszy",
 | 
			
		||||
    "Keyboard": "Klawiatura",
 | 
			
		||||
    "Show Keyboard": "Pokaż klawiaturę",
 | 
			
		||||
    "Extra keys": "Przyciski dodatkowe",
 | 
			
		||||
    "Show Extra Keys": "Pokaż przyciski dodatkowe",
 | 
			
		||||
    "Ctrl": "Ctrl",
 | 
			
		||||
    "Toggle Ctrl": "Przełącz Ctrl",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "Przełącz Alt",
 | 
			
		||||
    "Send Tab": "Wyślij Tab",
 | 
			
		||||
    "Tab": "Tab",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "Wyślij Escape",
 | 
			
		||||
    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "Wyślij Ctrl-Alt-Del",
 | 
			
		||||
    "Shutdown/Reboot": "Wyłącz/Uruchom ponownie",
 | 
			
		||||
    "Shutdown/Reboot...": "Wyłącz/Uruchom ponownie...",
 | 
			
		||||
    "Power": "Włączony",
 | 
			
		||||
    "Shutdown": "Wyłącz",
 | 
			
		||||
    "Reboot": "Uruchom ponownie",
 | 
			
		||||
    "Reset": "Resetuj",
 | 
			
		||||
    "Clipboard": "Schowek",
 | 
			
		||||
    "Clear": "Wyczyść",
 | 
			
		||||
    "Fullscreen": "Pełny ekran",
 | 
			
		||||
    "Settings": "Ustawienia",
 | 
			
		||||
    "Shared Mode": "Tryb Współdzielenia",
 | 
			
		||||
    "View Only": "Tylko Podgląd",
 | 
			
		||||
    "Clip to Window": "Przytnij do Okna",
 | 
			
		||||
    "Scaling Mode:": "Tryb Skalowania:",
 | 
			
		||||
    "None": "Brak",
 | 
			
		||||
    "Local Scaling": "Skalowanie lokalne",
 | 
			
		||||
    "Remote Resizing": "Skalowanie zdalne",
 | 
			
		||||
    "Advanced": "Zaawansowane",
 | 
			
		||||
    "Repeater ID:": "ID Repeatera:",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "Szyfrowanie",
 | 
			
		||||
    "Host:": "Host:",
 | 
			
		||||
    "Port:": "Port:",
 | 
			
		||||
    "Path:": "Ścieżka:",
 | 
			
		||||
    "Automatic Reconnect": "Automatycznie wznawiaj połączenie",
 | 
			
		||||
    "Reconnect Delay (ms):": "Opóźnienie wznawiania (ms):",
 | 
			
		||||
    "Logging:": "Poziom logowania:",
 | 
			
		||||
    "Disconnect": "Rozłącz",
 | 
			
		||||
    "Connect": "Połącz",
 | 
			
		||||
    "Password:": "Hasło:",
 | 
			
		||||
    "Cancel": "Anuluj",
 | 
			
		||||
    "Canvas not supported.": "Element Canvas nie jest wspierany."
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								static/js/novnc/app/locale/sv.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "Ansluter...",
 | 
			
		||||
    "Connected (encrypted) to ": "Ansluten (krypterat) till ",
 | 
			
		||||
    "Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
 | 
			
		||||
    "Disconnecting...": "Kopplar ner...",
 | 
			
		||||
    "Disconnected": "Frånkopplad",
 | 
			
		||||
    "Must set host": "Du måste specifiera en värd",
 | 
			
		||||
    "Reconnecting...": "Återansluter...",
 | 
			
		||||
    "Password is required": "Lösenord krävs",
 | 
			
		||||
    "Disconnect timeout": "Det tog för lång tid att koppla ner",
 | 
			
		||||
    "noVNC encountered an error:": "noVNC stötte på ett problem:",
 | 
			
		||||
    "Hide/Show the control bar": "Göm/Visa kontrollbaren",
 | 
			
		||||
    "Move/Drag Viewport": "Flytta/Dra Vyn",
 | 
			
		||||
    "viewport drag": "dra vy",
 | 
			
		||||
    "Active Mouse Button": "Aktiv musknapp",
 | 
			
		||||
    "No mousebutton": "Ingen musknapp",
 | 
			
		||||
    "Left mousebutton": "Vänster musknapp",
 | 
			
		||||
    "Middle mousebutton": "Mitten-musknapp",
 | 
			
		||||
    "Right mousebutton": "Höger musknapp",
 | 
			
		||||
    "Keyboard": "Tangentbord",
 | 
			
		||||
    "Show Keyboard": "Visa Tangentbord",
 | 
			
		||||
    "Extra keys": "Extraknappar",
 | 
			
		||||
    "Show Extra Keys": "Visa Extraknappar",
 | 
			
		||||
    "Ctrl": "Ctrl",
 | 
			
		||||
    "Toggle Ctrl": "Växla Ctrl",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "Växla Alt",
 | 
			
		||||
    "Send Tab": "Skicka Tab",
 | 
			
		||||
    "Tab": "Tab",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "Skicka Escape",
 | 
			
		||||
    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "Skicka Ctrl-Alt-Del",
 | 
			
		||||
    "Shutdown/Reboot": "Stäng av/Boota om",
 | 
			
		||||
    "Shutdown/Reboot...": "Stäng av/Boota om...",
 | 
			
		||||
    "Power": "Ström",
 | 
			
		||||
    "Shutdown": "Stäng av",
 | 
			
		||||
    "Reboot": "Boota om",
 | 
			
		||||
    "Reset": "Återställ",
 | 
			
		||||
    "Clipboard": "Urklipp",
 | 
			
		||||
    "Clear": "Rensa",
 | 
			
		||||
    "Fullscreen": "Fullskärm",
 | 
			
		||||
    "Settings": "Inställningar",
 | 
			
		||||
    "Shared Mode": "Delat Läge",
 | 
			
		||||
    "View Only": "Endast Visning",
 | 
			
		||||
    "Clip to Window": "Begränsa till Fönster",
 | 
			
		||||
    "Scaling Mode:": "Skalningsläge:",
 | 
			
		||||
    "None": "Ingen",
 | 
			
		||||
    "Local Scaling": "Lokal Skalning",
 | 
			
		||||
    "Local Downscaling": "Lokal Nedskalning",
 | 
			
		||||
    "Remote Resizing": "Ändra Storlek",
 | 
			
		||||
    "Advanced": "Avancerat",
 | 
			
		||||
    "Local Cursor": "Lokal Muspekare",
 | 
			
		||||
    "Repeater ID:": "Repeater-ID:",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "Kryptera",
 | 
			
		||||
    "Host:": "Värd:",
 | 
			
		||||
    "Port:": "Port:",
 | 
			
		||||
    "Path:": "Sökväg:",
 | 
			
		||||
    "Automatic Reconnect": "Automatisk Återanslutning",
 | 
			
		||||
    "Reconnect Delay (ms):": "Fördröjning (ms):",
 | 
			
		||||
    "Logging:": "Loggning:",
 | 
			
		||||
    "Disconnect": "Koppla från",
 | 
			
		||||
    "Connect": "Anslut",
 | 
			
		||||
    "Password:": "Lösenord:",
 | 
			
		||||
    "Cancel": "Avbryt",
 | 
			
		||||
    "Canvas not supported.": "Canvas stöds ej"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/tr.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "Bağlanıyor...",
 | 
			
		||||
    "Disconnecting...": "Bağlantı kesiliyor...",
 | 
			
		||||
    "Reconnecting...": "Yeniden bağlantı kuruluyor...",
 | 
			
		||||
    "Internal error": "İç hata",
 | 
			
		||||
    "Must set host": "Sunucuyu kur",
 | 
			
		||||
    "Connected (encrypted) to ": "Bağlı (şifrelenmiş)",
 | 
			
		||||
    "Connected (unencrypted) to ": "Bağlandı (şifrelenmemiş)",
 | 
			
		||||
    "Something went wrong, connection is closed": "Bir şeyler ters gitti, bağlantı kesildi",
 | 
			
		||||
    "Disconnected": "Bağlantı kesildi",
 | 
			
		||||
    "New connection has been rejected with reason: ": "Bağlantı aşağıdaki nedenlerden dolayı reddedildi: ",
 | 
			
		||||
    "New connection has been rejected": "Bağlantı reddedildi",
 | 
			
		||||
    "Password is required": "Şifre gerekli",
 | 
			
		||||
    "noVNC encountered an error:": "Bir hata oluştu:",
 | 
			
		||||
    "Hide/Show the control bar": "Denetim masasını Gizle/Göster",
 | 
			
		||||
    "Move/Drag Viewport": "Görünümü Taşı/Sürükle",
 | 
			
		||||
    "viewport drag": "Görüntü penceresini sürükle",
 | 
			
		||||
    "Active Mouse Button": "Aktif Fare Düğmesi",
 | 
			
		||||
    "No mousebutton": "Fare düğmesi yok",
 | 
			
		||||
    "Left mousebutton": "Farenin sol düğmesi",
 | 
			
		||||
    "Middle mousebutton": "Farenin orta düğmesi",
 | 
			
		||||
    "Right mousebutton": "Farenin sağ düğmesi",
 | 
			
		||||
    "Keyboard": "Klavye",
 | 
			
		||||
    "Show Keyboard": "Klavye Düzenini Göster",
 | 
			
		||||
    "Extra keys": "Ekstra tuşlar",
 | 
			
		||||
    "Show Extra Keys": "Ekstra tuşları göster",
 | 
			
		||||
    "Ctrl": "Ctrl",
 | 
			
		||||
    "Toggle Ctrl": "Ctrl Değiştir ",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "Alt Değiştir",
 | 
			
		||||
    "Send Tab": "Sekme Gönder",
 | 
			
		||||
    "Tab": "Sekme",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "Boşluk Gönder",
 | 
			
		||||
    "Ctrl+Alt+Del": "Ctrl + Alt + Del",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Gönder",
 | 
			
		||||
    "Shutdown/Reboot": "Kapat/Yeniden Başlat",
 | 
			
		||||
    "Shutdown/Reboot...": "Kapat/Yeniden Başlat...",
 | 
			
		||||
    "Power": "Güç",
 | 
			
		||||
    "Shutdown": "Kapat",
 | 
			
		||||
    "Reboot": "Yeniden Başlat",
 | 
			
		||||
    "Reset": "Sıfırla",
 | 
			
		||||
    "Clipboard": "Pano",
 | 
			
		||||
    "Clear": "Temizle",
 | 
			
		||||
    "Fullscreen": "Tam Ekran",
 | 
			
		||||
    "Settings": "Ayarlar",
 | 
			
		||||
    "Shared Mode": "Paylaşım Modu",
 | 
			
		||||
    "View Only": "Sadece Görüntüle",
 | 
			
		||||
    "Clip to Window": "Pencereye Tıkla",
 | 
			
		||||
    "Scaling Mode:": "Ölçekleme Modu:",
 | 
			
		||||
    "None": "Bilinmeyen",
 | 
			
		||||
    "Local Scaling": "Yerel Ölçeklendirme",
 | 
			
		||||
    "Remote Resizing": "Uzaktan Yeniden Boyutlandırma",
 | 
			
		||||
    "Advanced": "Gelişmiş",
 | 
			
		||||
    "Repeater ID:": "Tekralayıcı ID:",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "Şifrele",
 | 
			
		||||
    "Host:": "Ana makine:",
 | 
			
		||||
    "Port:": "Port:",
 | 
			
		||||
    "Path:": "Yol:",
 | 
			
		||||
    "Automatic Reconnect": "Otomatik Yeniden Bağlan",
 | 
			
		||||
    "Reconnect Delay (ms):": "Yeniden Bağlanma Süreci (ms):",
 | 
			
		||||
    "Logging:": "Giriş yapılıyor:",
 | 
			
		||||
    "Disconnect": "Bağlantıyı Kes",
 | 
			
		||||
    "Connect": "Bağlan",
 | 
			
		||||
    "Password:": "Parola:",
 | 
			
		||||
    "Cancel": "Vazgeç",
 | 
			
		||||
    "Canvas not supported.": "Tuval desteklenmiyor."
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/zh.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
{
 | 
			
		||||
    "Connecting...": "連線中...",
 | 
			
		||||
    "Disconnecting...": "正在中斷連線...",
 | 
			
		||||
    "Reconnecting...": "重新連線中...",
 | 
			
		||||
    "Internal error": "內部錯誤",
 | 
			
		||||
    "Must set host": "請提供主機資訊",
 | 
			
		||||
    "Connected (encrypted) to ": "已加密連線到",
 | 
			
		||||
    "Connected (unencrypted) to ": "未加密連線到",
 | 
			
		||||
    "Something went wrong, connection is closed": "發生錯誤,連線已關閉",
 | 
			
		||||
    "Failed to connect to server": "無法連線到伺服器",
 | 
			
		||||
    "Disconnected": "連線已中斷",
 | 
			
		||||
    "New connection has been rejected with reason: ": "連線被拒絕,原因:",
 | 
			
		||||
    "New connection has been rejected": "連線被拒絕",
 | 
			
		||||
    "Password is required": "請提供密碼",
 | 
			
		||||
    "noVNC encountered an error:": "noVNC 遇到一個錯誤:",
 | 
			
		||||
    "Hide/Show the control bar": "顯示/隱藏控制列",
 | 
			
		||||
    "Move/Drag Viewport": "拖放顯示範圍",
 | 
			
		||||
    "viewport drag": "顯示範圍拖放",
 | 
			
		||||
    "Active Mouse Button": "啟用滑鼠按鍵",
 | 
			
		||||
    "No mousebutton": "無滑鼠按鍵",
 | 
			
		||||
    "Left mousebutton": "滑鼠左鍵",
 | 
			
		||||
    "Middle mousebutton": "滑鼠中鍵",
 | 
			
		||||
    "Right mousebutton": "滑鼠右鍵",
 | 
			
		||||
    "Keyboard": "鍵盤",
 | 
			
		||||
    "Show Keyboard": "顯示鍵盤",
 | 
			
		||||
    "Extra keys": "額外按鍵",
 | 
			
		||||
    "Show Extra Keys": "顯示額外按鍵",
 | 
			
		||||
    "Ctrl": "Ctrl",
 | 
			
		||||
    "Toggle Ctrl": "切換 Ctrl",
 | 
			
		||||
    "Alt": "Alt",
 | 
			
		||||
    "Toggle Alt": "切換 Alt",
 | 
			
		||||
    "Send Tab": "送出 Tab 鍵",
 | 
			
		||||
    "Tab": "Tab",
 | 
			
		||||
    "Esc": "Esc",
 | 
			
		||||
    "Send Escape": "送出 Escape 鍵",
 | 
			
		||||
    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
 | 
			
		||||
    "Send Ctrl-Alt-Del": "送出 Ctrl-Alt-Del 快捷鍵",
 | 
			
		||||
    "Shutdown/Reboot": "關機/重新啟動",
 | 
			
		||||
    "Shutdown/Reboot...": "關機/重新啟動...",
 | 
			
		||||
    "Power": "電源",
 | 
			
		||||
    "Shutdown": "關機",
 | 
			
		||||
    "Reboot": "重新啟動",
 | 
			
		||||
    "Reset": "重設",
 | 
			
		||||
    "Clipboard": "剪貼簿",
 | 
			
		||||
    "Clear": "清除",
 | 
			
		||||
    "Fullscreen": "全螢幕",
 | 
			
		||||
    "Settings": "設定",
 | 
			
		||||
    "Shared Mode": "分享模式",
 | 
			
		||||
    "View Only": "僅檢視",
 | 
			
		||||
    "Clip to Window": "限制/裁切視窗大小",
 | 
			
		||||
    "Scaling Mode:": "縮放模式:",
 | 
			
		||||
    "None": "無",
 | 
			
		||||
    "Local Scaling": "本機縮放",
 | 
			
		||||
    "Remote Resizing": "遠端調整大小",
 | 
			
		||||
    "Advanced": "進階",
 | 
			
		||||
    "Repeater ID:": "中繼站 ID",
 | 
			
		||||
    "WebSocket": "WebSocket",
 | 
			
		||||
    "Encrypt": "加密",
 | 
			
		||||
    "Host:": "主機:",
 | 
			
		||||
    "Port:": "連接埠:",
 | 
			
		||||
    "Path:": "路徑:",
 | 
			
		||||
    "Automatic Reconnect": "自動重新連線",
 | 
			
		||||
    "Reconnect Delay (ms):": "重新連線間隔 (ms):",
 | 
			
		||||
    "Logging:": "日誌級別:",
 | 
			
		||||
    "Disconnect": "中斷連線",
 | 
			
		||||
    "Connect": "連線",
 | 
			
		||||
    "Password:": "密碼:",
 | 
			
		||||
    "Cancel": "取消"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										163
									
								
								static/js/novnc/app/localization.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,163 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.Localizer = Localizer;
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Localization Utilities
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
function Localizer() {
 | 
			
		||||
    // Currently configured language
 | 
			
		||||
    this.language = 'en';
 | 
			
		||||
 | 
			
		||||
    // Current dictionary of translations
 | 
			
		||||
    this.dictionary = undefined;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Localizer.prototype = {
 | 
			
		||||
    // Configure suitable language based on user preferences
 | 
			
		||||
    setup: function (supportedLanguages) {
 | 
			
		||||
        var userLanguages;
 | 
			
		||||
 | 
			
		||||
        this.language = 'en'; // Default: US English
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * Navigator.languages only available in Chrome (32+) and FireFox (32+)
 | 
			
		||||
         * Fall back to navigator.language for other browsers
 | 
			
		||||
         */
 | 
			
		||||
        if (typeof window.navigator.languages == 'object') {
 | 
			
		||||
            userLanguages = window.navigator.languages;
 | 
			
		||||
        } else {
 | 
			
		||||
            userLanguages = [navigator.language || navigator.userLanguage];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (var i = 0; i < userLanguages.length; i++) {
 | 
			
		||||
            var userLang = userLanguages[i];
 | 
			
		||||
            userLang = userLang.toLowerCase();
 | 
			
		||||
            userLang = userLang.replace("_", "-");
 | 
			
		||||
            userLang = userLang.split("-");
 | 
			
		||||
 | 
			
		||||
            // Built-in default?
 | 
			
		||||
            if (userLang[0] === 'en' && (userLang[1] === undefined || userLang[1] === 'us')) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // First pass: perfect match
 | 
			
		||||
            for (var j = 0; j < supportedLanguages.length; j++) {
 | 
			
		||||
                var supLang = supportedLanguages[j];
 | 
			
		||||
                supLang = supLang.toLowerCase();
 | 
			
		||||
                supLang = supLang.replace("_", "-");
 | 
			
		||||
                supLang = supLang.split("-");
 | 
			
		||||
 | 
			
		||||
                if (userLang[0] !== supLang[0]) continue;
 | 
			
		||||
                if (userLang[1] !== supLang[1]) continue;
 | 
			
		||||
 | 
			
		||||
                this.language = supportedLanguages[j];
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Second pass: fallback
 | 
			
		||||
            for (var j = 0; j < supportedLanguages.length; j++) {
 | 
			
		||||
                supLang = supportedLanguages[j];
 | 
			
		||||
                supLang = supLang.toLowerCase();
 | 
			
		||||
                supLang = supLang.replace("_", "-");
 | 
			
		||||
                supLang = supLang.split("-");
 | 
			
		||||
 | 
			
		||||
                if (userLang[0] !== supLang[0]) continue;
 | 
			
		||||
                if (supLang[1] !== undefined) continue;
 | 
			
		||||
 | 
			
		||||
                this.language = supportedLanguages[j];
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Retrieve localised text
 | 
			
		||||
    get: function (id) {
 | 
			
		||||
        if (typeof this.dictionary !== 'undefined' && this.dictionary[id]) {
 | 
			
		||||
            return this.dictionary[id];
 | 
			
		||||
        } else {
 | 
			
		||||
            return id;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Traverses the DOM and translates relevant fields
 | 
			
		||||
    // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate
 | 
			
		||||
    translateDOM: function () {
 | 
			
		||||
        var self = this;
 | 
			
		||||
        function process(elem, enabled) {
 | 
			
		||||
            function isAnyOf(searchElement, items) {
 | 
			
		||||
                return items.indexOf(searchElement) !== -1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function translateAttribute(elem, attr) {
 | 
			
		||||
                var str = elem.getAttribute(attr);
 | 
			
		||||
                str = self.get(str);
 | 
			
		||||
                elem.setAttribute(attr, str);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            function translateTextNode(node) {
 | 
			
		||||
                var str = node.data.trim();
 | 
			
		||||
                str = self.get(str);
 | 
			
		||||
                node.data = str;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (elem.hasAttribute("translate")) {
 | 
			
		||||
                if (isAnyOf(elem.getAttribute("translate"), ["", "yes"])) {
 | 
			
		||||
                    enabled = true;
 | 
			
		||||
                } else if (isAnyOf(elem.getAttribute("translate"), ["no"])) {
 | 
			
		||||
                    enabled = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (enabled) {
 | 
			
		||||
                if (elem.hasAttribute("abbr") && elem.tagName === "TH") {
 | 
			
		||||
                    translateAttribute(elem, "abbr");
 | 
			
		||||
                }
 | 
			
		||||
                if (elem.hasAttribute("alt") && isAnyOf(elem.tagName, ["AREA", "IMG", "INPUT"])) {
 | 
			
		||||
                    translateAttribute(elem, "alt");
 | 
			
		||||
                }
 | 
			
		||||
                if (elem.hasAttribute("download") && isAnyOf(elem.tagName, ["A", "AREA"])) {
 | 
			
		||||
                    translateAttribute(elem, "download");
 | 
			
		||||
                }
 | 
			
		||||
                if (elem.hasAttribute("label") && isAnyOf(elem.tagName, ["MENUITEM", "MENU", "OPTGROUP", "OPTION", "TRACK"])) {
 | 
			
		||||
                    translateAttribute(elem, "label");
 | 
			
		||||
                }
 | 
			
		||||
                // FIXME: Should update "lang"
 | 
			
		||||
                if (elem.hasAttribute("placeholder") && isAnyOf(elem.tagName, ["INPUT", "TEXTAREA"])) {
 | 
			
		||||
                    translateAttribute(elem, "placeholder");
 | 
			
		||||
                }
 | 
			
		||||
                if (elem.hasAttribute("title")) {
 | 
			
		||||
                    translateAttribute(elem, "title");
 | 
			
		||||
                }
 | 
			
		||||
                if (elem.hasAttribute("value") && elem.tagName === "INPUT" && isAnyOf(elem.getAttribute("type"), ["reset", "button", "submit"])) {
 | 
			
		||||
                    translateAttribute(elem, "value");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (var i = 0; i < elem.childNodes.length; i++) {
 | 
			
		||||
                var node = elem.childNodes[i];
 | 
			
		||||
                if (node.nodeType === node.ELEMENT_NODE) {
 | 
			
		||||
                    process(node, enabled);
 | 
			
		||||
                } else if (node.nodeType === node.TEXT_NODE && enabled) {
 | 
			
		||||
                    translateTextNode(node);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        process(document.body, true);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var l10n = exports.l10n = new Localizer();
 | 
			
		||||
exports.default = l10n.get.bind(l10n);
 | 
			
		||||
							
								
								
									
										4
									
								
								static/js/novnc/app/sounds/CREDITS
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
bell
 | 
			
		||||
        Copyright: Dr. Richard Boulanger et al
 | 
			
		||||
        URL: http://www.archive.org/details/Berklee44v12
 | 
			
		||||
        License: CC-BY Attribution 3.0 Unported
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/sounds/bell.mp3
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/sounds/bell.oga
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								static/js/novnc/Orbitron700.ttf → static/js/novnc/app/styles/Orbitron700.ttf
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								static/js/novnc/Orbitron700.woff → static/js/novnc/app/styles/Orbitron700.woff
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
							
								
								
									
										902
									
								
								static/js/novnc/app/styles/base.css
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,902 @@
 | 
			
		|||
/*
 | 
			
		||||
 * noVNC base CSS
 | 
			
		||||
 * Copyright (C) 2012 Joel Martin
 | 
			
		||||
 * Copyright (C) 2016 Samuel Mannehed for Cendio AB
 | 
			
		||||
 * Copyright (C) 2016 Pierre Ossman 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).
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Z index layers:
 | 
			
		||||
 *
 | 
			
		||||
 * 0: Main screen
 | 
			
		||||
 * 10: Control bar
 | 
			
		||||
 * 50: Transition blocker
 | 
			
		||||
 * 60: Connection popups
 | 
			
		||||
 * 100: Status bar
 | 
			
		||||
 * ...
 | 
			
		||||
 * 1000: Javascript crash
 | 
			
		||||
 * ...
 | 
			
		||||
 * 10000: Max (used for polyfills)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
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%;
 | 
			
		||||
  touch-action: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
  height:100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_only_touch.noVNC_hidden {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_disabled {
 | 
			
		||||
  color: rgb(128, 128, 128);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Spinner
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
.noVNC_spinner {
 | 
			
		||||
  position: relative;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after {
 | 
			
		||||
  width: 10px;
 | 
			
		||||
  height: 10px;
 | 
			
		||||
  border-radius: 2px;
 | 
			
		||||
  box-shadow: -60px 10px 0 rgba(255, 255, 255, 0);
 | 
			
		||||
  animation: noVNC_spinner 1.0s linear infinite;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_spinner::before {
 | 
			
		||||
  content: "";
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  left: 0px;
 | 
			
		||||
  top: 0px;
 | 
			
		||||
  animation-delay: -0.1s;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_spinner::after {
 | 
			
		||||
  content: "";
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 0px;
 | 
			
		||||
  left: 0px;
 | 
			
		||||
  animation-delay: 0.1s;
 | 
			
		||||
}
 | 
			
		||||
@keyframes noVNC_spinner {
 | 
			
		||||
  0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; }
 | 
			
		||||
  25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; }
 | 
			
		||||
  50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Input Elements
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
input[type=input], input[type=password], input[type=number],
 | 
			
		||||
input:not([type]), textarea {
 | 
			
		||||
  /* Disable default rendering */
 | 
			
		||||
  -webkit-appearance: none;
 | 
			
		||||
  -moz-appearance: none;
 | 
			
		||||
  background: none;
 | 
			
		||||
 | 
			
		||||
  margin: 2px;
 | 
			
		||||
  padding: 2px;
 | 
			
		||||
  border: 1px solid rgb(192, 192, 192);
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  color: black;
 | 
			
		||||
  background: linear-gradient(to top, rgb(255, 255, 255) 80%, rgb(240, 240, 240));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type=button], input[type=submit], select {
 | 
			
		||||
  /* Disable default rendering */
 | 
			
		||||
  -webkit-appearance: none;
 | 
			
		||||
  -moz-appearance: none;
 | 
			
		||||
  background: none;
 | 
			
		||||
 | 
			
		||||
  margin: 2px;
 | 
			
		||||
  padding: 2px;
 | 
			
		||||
  border: 1px solid rgb(192, 192, 192);
 | 
			
		||||
  border-bottom-width: 2px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  color: black;
 | 
			
		||||
  background: linear-gradient(to top, rgb(255, 255, 255), rgb(240, 240, 240));
 | 
			
		||||
 | 
			
		||||
  /* This avoids it jumping around when :active */
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type=button], input[type=submit] {
 | 
			
		||||
  padding-left: 20px;
 | 
			
		||||
  padding-right: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
option {
 | 
			
		||||
  color: black;
 | 
			
		||||
  background: white;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type=input]:focus, input[type=password]:focus,
 | 
			
		||||
input:not([type]):focus, input[type=button]:focus,
 | 
			
		||||
input[type=submit]:focus,
 | 
			
		||||
textarea:focus, select:focus {
 | 
			
		||||
  box-shadow: 0px 0px 3px rgba(74, 144, 217, 0.5);
 | 
			
		||||
  border-color: rgb(74, 144, 217);
 | 
			
		||||
  outline: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type=button]::-moz-focus-inner,
 | 
			
		||||
input[type=submit]::-moz-focus-inner {
 | 
			
		||||
  border: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type=input]:disabled, input[type=password]:disabled,
 | 
			
		||||
input:not([type]):disabled, input[type=button]:disabled,
 | 
			
		||||
input[type=submit]:disabled, input[type=number]:disabled,
 | 
			
		||||
textarea:disabled, select:disabled {
 | 
			
		||||
  color: rgb(128, 128, 128);
 | 
			
		||||
  background: rgb(240, 240, 240);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input[type=button]:active, input[type=submit]:active,
 | 
			
		||||
select:active {
 | 
			
		||||
  border-bottom-width: 1px;
 | 
			
		||||
  margin-top: 3px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:root:not(.noVNC_touch) input[type=button]:hover:not(:disabled),
 | 
			
		||||
:root:not(.noVNC_touch) input[type=submit]:hover:not(:disabled),
 | 
			
		||||
:root:not(.noVNC_touch) select:hover:not(:disabled) {
 | 
			
		||||
  background: linear-gradient(to top, rgb(255, 255, 255), rgb(250, 250, 250));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * WebKit centering hacks
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
.noVNC_center {
 | 
			
		||||
  /*
 | 
			
		||||
   * This is a workaround because webkit misrenders transforms and
 | 
			
		||||
   * uses non-integer coordinates, resulting in blurry content.
 | 
			
		||||
   * Ideally we'd use "top: 50%; transform: translateY(-50%);" on
 | 
			
		||||
   * the objects instead.
 | 
			
		||||
   */
 | 
			
		||||
  display: flex;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_center > * {
 | 
			
		||||
  pointer-events: auto;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_vcenter {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_vcenter > * {
 | 
			
		||||
  pointer-events: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Layering
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
.noVNC_connect_layer {
 | 
			
		||||
  z-index: 60;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Fallback error
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#noVNC_fallback_error {
 | 
			
		||||
  z-index: 1000;
 | 
			
		||||
  visibility: hidden;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_fallback_error.noVNC_open {
 | 
			
		||||
  visibility: visible;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_fallback_error > div {
 | 
			
		||||
  max-width: 90%;
 | 
			
		||||
  padding: 15px;
 | 
			
		||||
 | 
			
		||||
  transition: 0.5s ease-in-out;
 | 
			
		||||
 | 
			
		||||
  transform: translateY(-50px);
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
 | 
			
		||||
  border-radius: 10px;
 | 
			
		||||
  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
 | 
			
		||||
  background: rgba(200,55,55,0.8);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_fallback_error.noVNC_open > div {
 | 
			
		||||
  transform: translateY(0);
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_fallback_errormsg {
 | 
			
		||||
  font-weight: normal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_fallback_errormsg .noVNC_message {
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  text-align: left;
 | 
			
		||||
  font-family: monospace;
 | 
			
		||||
  white-space: pre-wrap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_fallback_error .noVNC_location {
 | 
			
		||||
  font-style: italic;
 | 
			
		||||
  font-size: 0.8em;
 | 
			
		||||
  color: rgba(255, 255, 255, 0.8);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_fallback_error .noVNC_stack {
 | 
			
		||||
  max-height: 50vh;
 | 
			
		||||
  padding: 10px;
 | 
			
		||||
  margin: 10px;
 | 
			
		||||
  font-size: 0.8em;
 | 
			
		||||
  text-align: left;
 | 
			
		||||
  font-family: monospace;
 | 
			
		||||
  white-space: pre;
 | 
			
		||||
  border: 1px solid rgba(0, 0, 0, 0.5);
 | 
			
		||||
  background: rgba(0, 0, 0, 0.2);
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Control Bar
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#noVNC_control_bar_anchor {
 | 
			
		||||
  /* The anchor is needed to get z-stacking to work */
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  z-index: 10;
 | 
			
		||||
 | 
			
		||||
  transition: 0.5s ease-in-out;
 | 
			
		||||
 | 
			
		||||
  /* Edge misrenders animations wihthout this */
 | 
			
		||||
  transform: translateX(0);
 | 
			
		||||
}
 | 
			
		||||
:root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle {
 | 
			
		||||
  opacity: 0.8;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar_anchor.noVNC_right {
 | 
			
		||||
  left: auto;
 | 
			
		||||
  right: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_control_bar {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  left: -100%;
 | 
			
		||||
 | 
			
		||||
  transition: 0.5s ease-in-out;
 | 
			
		||||
 | 
			
		||||
  background-color: rgb(110, 132, 163);
 | 
			
		||||
  border-radius: 0 10px 10px 0;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar.noVNC_open {
 | 
			
		||||
  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
 | 
			
		||||
  left: 0;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar::before {
 | 
			
		||||
  /* This extra element is to get a proper shadow */
 | 
			
		||||
  content: "";
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  z-index: -1;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  width: 30px;
 | 
			
		||||
  left: -30px;
 | 
			
		||||
  transition: box-shadow 0.5s ease-in-out;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar.noVNC_open::before {
 | 
			
		||||
  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar {
 | 
			
		||||
  left: 100%;
 | 
			
		||||
  border-radius: 10px 0 0 10px;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar.noVNC_open {
 | 
			
		||||
  left: 0;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar::before {
 | 
			
		||||
  visibility: hidden;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_control_bar_handle {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  left: -15px;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  transform: translateY(35px);
 | 
			
		||||
  width: calc(100% + 30px);
 | 
			
		||||
  height: 50px;
 | 
			
		||||
  z-index: -1;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  background-color: rgb(83, 99, 122);
 | 
			
		||||
  background-image: url("../images/handle_bg.svg");
 | 
			
		||||
  background-repeat: no-repeat;
 | 
			
		||||
  background-position: right;
 | 
			
		||||
  box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar_handle:after {
 | 
			
		||||
  content: "";
 | 
			
		||||
  transition: transform 0.5s ease-in-out;
 | 
			
		||||
  background: url("../images/handle.svg");
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 22px; /* (50px-6px)/2 */
 | 
			
		||||
  right: 5px;
 | 
			
		||||
  width: 5px;
 | 
			
		||||
  height: 6px;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
 | 
			
		||||
  transform: translateX(1px) rotate(180deg);
 | 
			
		||||
}
 | 
			
		||||
:root:not(.noVNC_connected) #noVNC_control_bar_handle {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar_handle {
 | 
			
		||||
  background-position: left;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar_handle:after {
 | 
			
		||||
  left: 5px;
 | 
			
		||||
  right: 0;
 | 
			
		||||
  transform: translateX(1px) rotate(180deg);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
 | 
			
		||||
  transform: none;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar_handle div {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  right: -35px;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  width: 50px;
 | 
			
		||||
  height: 50px;
 | 
			
		||||
}
 | 
			
		||||
:root:not(.noVNC_touch) #noVNC_control_bar_handle div {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar_handle div {
 | 
			
		||||
  left: -35px;
 | 
			
		||||
  right: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_control_bar .noVNC_scroll {
 | 
			
		||||
  max-height: 100vh; /* Chrome is buggy with 100% */
 | 
			
		||||
  overflow-x: hidden;
 | 
			
		||||
  overflow-y: auto;
 | 
			
		||||
  padding: 0 10px 0 5px;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right #noVNC_control_bar .noVNC_scroll {
 | 
			
		||||
  padding: 0 5px 0 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Control bar hint */
 | 
			
		||||
#noVNC_control_bar_hint {
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  left: calc(100vw - 50px);
 | 
			
		||||
  right: auto;
 | 
			
		||||
  top: 50%;
 | 
			
		||||
  transform: translateY(-50%) scale(0);
 | 
			
		||||
  width: 100px;
 | 
			
		||||
  height: 50%;
 | 
			
		||||
  max-height: 600px;
 | 
			
		||||
 | 
			
		||||
  visibility: hidden;
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
  transition: 0.2s ease-in-out;
 | 
			
		||||
  background: transparent;
 | 
			
		||||
  box-shadow: 0 0 10px black, inset 0 0 10px 10px rgba(110, 132, 163, 0.8);
 | 
			
		||||
  border-radius: 10px;
 | 
			
		||||
  transition-delay: 0s;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar_anchor.noVNC_right #noVNC_control_bar_hint{
 | 
			
		||||
  left: auto;
 | 
			
		||||
  right: calc(100vw - 50px);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_control_bar_hint.noVNC_active {
 | 
			
		||||
  visibility: visible;
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
  transition-delay: 0.2s;
 | 
			
		||||
  transform: translateY(-50%) scale(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* General button style */
 | 
			
		||||
.noVNC_button {
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: 4px 4px;
 | 
			
		||||
  margin: 10px 0;
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
  border:1px solid rgba(255, 255, 255, 0.2);
 | 
			
		||||
  border-radius: 6px;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_button.noVNC_selected {
 | 
			
		||||
  border-color: rgba(0, 0, 0, 0.8);
 | 
			
		||||
  background: rgba(0, 0, 0, 0.5);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_button:disabled {
 | 
			
		||||
  opacity: 0.4;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_button:focus {
 | 
			
		||||
  outline: none;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_button:active {
 | 
			
		||||
  padding-top: 5px;
 | 
			
		||||
  padding-bottom: 3px;
 | 
			
		||||
}
 | 
			
		||||
/* Android browsers don't properly update hover state if touch events
 | 
			
		||||
 * are intercepted, but focus should be safe to display */
 | 
			
		||||
:root:not(.noVNC_touch) .noVNC_button.noVNC_selected:hover,
 | 
			
		||||
.noVNC_button.noVNC_selected:focus {
 | 
			
		||||
  border-color: rgba(0, 0, 0, 0.4);
 | 
			
		||||
  background: rgba(0, 0, 0, 0.2);
 | 
			
		||||
}
 | 
			
		||||
:root:not(.noVNC_touch) .noVNC_button:hover,
 | 
			
		||||
.noVNC_button:focus {
 | 
			
		||||
  background: rgba(255, 255, 255, 0.2);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_button.noVNC_hidden {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Panels */
 | 
			
		||||
.noVNC_panel {
 | 
			
		||||
  transform: translateX(25px);
 | 
			
		||||
 | 
			
		||||
  transition: 0.5s ease-in-out;
 | 
			
		||||
 | 
			
		||||
  max-height: 100vh; /* Chrome is buggy with 100% */
 | 
			
		||||
  overflow-x: hidden;
 | 
			
		||||
  overflow-y: auto;
 | 
			
		||||
 | 
			
		||||
  visibility: hidden;
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
 | 
			
		||||
  padding: 15px;
 | 
			
		||||
 | 
			
		||||
  background: #fff;
 | 
			
		||||
  border-radius: 10px;
 | 
			
		||||
  color: #000;
 | 
			
		||||
  border: 2px solid #E0E0E0;
 | 
			
		||||
  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_panel.noVNC_open {
 | 
			
		||||
  visibility: visible;
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
  transform: translateX(75px);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right .noVNC_vcenter {
 | 
			
		||||
  left: auto;
 | 
			
		||||
  right: 0;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right .noVNC_panel {
 | 
			
		||||
  transform: translateX(-25px);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_right .noVNC_panel.noVNC_open {
 | 
			
		||||
  transform: translateX(-75px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_panel hr {
 | 
			
		||||
  border: none;
 | 
			
		||||
  border-top: 1px solid rgb(192, 192, 192);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_panel label {
 | 
			
		||||
  display: block;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_panel .noVNC_heading {
 | 
			
		||||
  background-color: rgb(110, 132, 163);
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  padding: 5px;
 | 
			
		||||
  /* Compensate for padding in image */
 | 
			
		||||
  padding-right: 8px;
 | 
			
		||||
  color: white;
 | 
			
		||||
  font-size: 20px;
 | 
			
		||||
  margin-bottom: 10px;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_panel .noVNC_heading img {
 | 
			
		||||
  vertical-align: bottom;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_submit {
 | 
			
		||||
  float: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Expanders */
 | 
			
		||||
.noVNC_expander {
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_expander::before {
 | 
			
		||||
  content: url("../images/expander.svg");
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  margin-right: 5px;
 | 
			
		||||
  transition: 0.2s ease-in-out;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_expander.noVNC_open::before {
 | 
			
		||||
  transform: rotateZ(90deg);
 | 
			
		||||
}
 | 
			
		||||
.noVNC_expander ~ * {
 | 
			
		||||
  margin: 5px;
 | 
			
		||||
  margin-left: 10px;
 | 
			
		||||
  padding: 5px;
 | 
			
		||||
  background: rgba(0, 0, 0, 0.05);
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_expander:not(.noVNC_open) ~ * {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Control bar content */
 | 
			
		||||
 | 
			
		||||
#noVNC_control_bar .noVNC_logo {
 | 
			
		||||
  font-size: 13px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:root:not(.noVNC_connected) #noVNC_view_drag_button {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* noVNC Touch Device only buttons */
 | 
			
		||||
:root:not(.noVNC_connected) #noVNC_mobile_buttons {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
:root:not(.noVNC_touch) #noVNC_mobile_buttons {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Extra manual keys */
 | 
			
		||||
:root:not(.noVNC_connected) #noVNC_extra_keys {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_modifiers {
 | 
			
		||||
  background-color: rgb(92, 92, 92);
 | 
			
		||||
  border: none;
 | 
			
		||||
  padding: 0 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Shutdown/Reboot */
 | 
			
		||||
:root:not(.noVNC_connected) #noVNC_power_button {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_power {
 | 
			
		||||
}
 | 
			
		||||
#noVNC_power_buttons {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_power input[type=button] {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Clipboard */
 | 
			
		||||
:root:not(.noVNC_connected) #noVNC_clipboard_button {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_clipboard {
 | 
			
		||||
  /* Full screen, minus padding and left and right margins */
 | 
			
		||||
  max-width: calc(100vw - 2*15px - 75px - 25px);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_clipboard_text {
 | 
			
		||||
  width: 500px;
 | 
			
		||||
  max-width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Settings */
 | 
			
		||||
#noVNC_settings {
 | 
			
		||||
}
 | 
			
		||||
#noVNC_settings ul {
 | 
			
		||||
  list-style: none;
 | 
			
		||||
  margin: 0px;
 | 
			
		||||
  padding: 0px;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_setting_port {
 | 
			
		||||
  width: 80px;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_setting_path {
 | 
			
		||||
  width: 100px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Connection Controls */
 | 
			
		||||
:root:not(.noVNC_connected) #noVNC_disconnect_button {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Status Dialog
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#noVNC_status {
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  z-index: 100;
 | 
			
		||||
  transform: translateY(-100%);
 | 
			
		||||
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
 | 
			
		||||
  transition: 0.5s ease-in-out;
 | 
			
		||||
 | 
			
		||||
  visibility: hidden;
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
 | 
			
		||||
  padding: 5px;
 | 
			
		||||
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  align-content: center;
 | 
			
		||||
 | 
			
		||||
  line-height: 25px;
 | 
			
		||||
  word-wrap: break-word;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
 | 
			
		||||
  border-bottom: 1px solid rgba(0, 0, 0, 0.9);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_status.noVNC_open {
 | 
			
		||||
  transform: translateY(0);
 | 
			
		||||
  visibility: visible;
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_status::before {
 | 
			
		||||
  content: "";
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  width: 25px;
 | 
			
		||||
  height: 25px;
 | 
			
		||||
  margin-right: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_status.noVNC_status_normal {
 | 
			
		||||
  background: rgba(128,128,128,0.9);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_status.noVNC_status_normal::before {
 | 
			
		||||
  content: url("../images/info.svg") " ";
 | 
			
		||||
}
 | 
			
		||||
#noVNC_status.noVNC_status_error {
 | 
			
		||||
  background: rgba(200,55,55,0.9);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_status.noVNC_status_error::before {
 | 
			
		||||
  content: url("../images/error.svg") " ";
 | 
			
		||||
}
 | 
			
		||||
#noVNC_status.noVNC_status_warn {
 | 
			
		||||
  background: rgba(180,180,30,0.9);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_status.noVNC_status_warn::before {
 | 
			
		||||
  content: url("../images/warning.svg") " ";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Connect Dialog
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#noVNC_connect_dlg {
 | 
			
		||||
  transition: 0.5s ease-in-out;
 | 
			
		||||
 | 
			
		||||
  transform: scale(0, 0);
 | 
			
		||||
  visibility: hidden;
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_connect_dlg.noVNC_open {
 | 
			
		||||
  transform: scale(1, 1);
 | 
			
		||||
  visibility: visible;
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_connect_dlg .noVNC_logo {
 | 
			
		||||
  transition: 0.5s ease-in-out;
 | 
			
		||||
  padding: 10px;
 | 
			
		||||
  margin-bottom: 10px;
 | 
			
		||||
 | 
			
		||||
  font-size: 80px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
@media (max-width: 440px) {
 | 
			
		||||
  #noVNC_connect_dlg {
 | 
			
		||||
    max-width: calc(100vw - 100px);
 | 
			
		||||
  }
 | 
			
		||||
  #noVNC_connect_dlg .noVNC_logo {
 | 
			
		||||
    font-size: calc(25vw - 30px);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
#noVNC_connect_button {
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
 | 
			
		||||
  padding: 10px;
 | 
			
		||||
 | 
			
		||||
  color: white;
 | 
			
		||||
  background-color: rgb(110, 132, 163);
 | 
			
		||||
  border-radius: 12px;
 | 
			
		||||
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  font-size: 20px;
 | 
			
		||||
 | 
			
		||||
  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_connect_button div {
 | 
			
		||||
  margin: 2px;
 | 
			
		||||
  padding: 5px 30px;
 | 
			
		||||
  border: 1px solid rgb(83, 99, 122);
 | 
			
		||||
  border-bottom-width: 2px;
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  background: linear-gradient(to top, rgb(110, 132, 163), rgb(99, 119, 147));
 | 
			
		||||
 | 
			
		||||
  /* This avoids it jumping around when :active */
 | 
			
		||||
  vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_connect_button div:active {
 | 
			
		||||
  border-bottom-width: 1px;
 | 
			
		||||
  margin-top: 3px;
 | 
			
		||||
}
 | 
			
		||||
:root:not(.noVNC_touch) #noVNC_connect_button div:hover {
 | 
			
		||||
  background: linear-gradient(to top, rgb(110, 132, 163), rgb(105, 125, 155));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_connect_button img {
 | 
			
		||||
  vertical-align: bottom;
 | 
			
		||||
  height: 1.3em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Password Dialog
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#noVNC_password_dlg {
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  transform: translateY(-50px);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_password_dlg.noVNC_open {
 | 
			
		||||
  transform: translateY(0);
 | 
			
		||||
}
 | 
			
		||||
#noVNC_password_dlg ul {
 | 
			
		||||
  list-style: none;
 | 
			
		||||
  margin: 0px;
 | 
			
		||||
  padding: 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Main Area
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Transition screen */
 | 
			
		||||
#noVNC_transition {
 | 
			
		||||
  display: none;
 | 
			
		||||
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  bottom: 0;
 | 
			
		||||
  right: 0;
 | 
			
		||||
 | 
			
		||||
  color: white;
 | 
			
		||||
  background: rgba(0, 0, 0, 0.5);
 | 
			
		||||
  z-index: 50;
 | 
			
		||||
 | 
			
		||||
  /*display: flex;*/
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
}
 | 
			
		||||
:root.noVNC_loading #noVNC_transition,
 | 
			
		||||
:root.noVNC_connecting #noVNC_transition,
 | 
			
		||||
:root.noVNC_disconnecting #noVNC_transition,
 | 
			
		||||
:root.noVNC_reconnecting #noVNC_transition {
 | 
			
		||||
  display: flex;
 | 
			
		||||
}
 | 
			
		||||
:root:not(.noVNC_reconnecting) #noVNC_cancel_reconnect_button {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_transition_text {
 | 
			
		||||
  font-size: 1.5em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Main container */
 | 
			
		||||
#noVNC_container {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  background-color: #313131;
 | 
			
		||||
  border-bottom-right-radius: 800px 600px;
 | 
			
		||||
  /*border-top-left-radius: 800px 600px;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_keyboardinput {
 | 
			
		||||
  width: 1px;
 | 
			
		||||
  height: 1px;
 | 
			
		||||
  background-color: #fff;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  border: 0;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  left: -40px;
 | 
			
		||||
  z-index: -1;
 | 
			
		||||
  ime-mode: disabled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*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 {
 | 
			
		||||
  color:yellow;
 | 
			
		||||
  font-family: 'Orbitron', 'OrbitronTTF', sans-serif;
 | 
			
		||||
  line-height:90%;
 | 
			
		||||
  text-shadow: 0.1em 0.1em 0 black;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_logo span{
 | 
			
		||||
  color:green;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_bell {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ----------------------------------------
 | 
			
		||||
 * Media sizing
 | 
			
		||||
 * ----------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@media screen and (max-width: 640px){
 | 
			
		||||
  #noVNC_logo {
 | 
			
		||||
    font-size: 150px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 321px) and (max-width: 480px) {
 | 
			
		||||
  #noVNC_logo {
 | 
			
		||||
    font-size: 110px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (max-width: 320px) {
 | 
			
		||||
  #noVNC_logo {
 | 
			
		||||
    font-size: 90px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								static/js/novnc/app/styles/lite.css
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
/*
 | 
			
		||||
 * noVNC auto CSS
 | 
			
		||||
 * Copyright (C) 2012 Joel Martin
 | 
			
		||||
 * Copyright (C) 2017 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;
 | 
			
		||||
  background-color:#313131;
 | 
			
		||||
  border-bottom-right-radius: 800px 600px;
 | 
			
		||||
  height:100%;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
  background-color:#494949;
 | 
			
		||||
  height:100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_status_bar {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  display:flex;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_status {
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  font: bold 12px Helvetica;
 | 
			
		||||
  margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_status_normal {
 | 
			
		||||
  background: linear-gradient(#b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_status_error {
 | 
			
		||||
  background: linear-gradient(#c83737 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_status_warn {
 | 
			
		||||
  background: linear-gradient(#b4b41e 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noNVC_shown {
 | 
			
		||||
  display: inline;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_hidden {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_left_dummy_elem {
 | 
			
		||||
  flex: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_buttons {
 | 
			
		||||
  padding: 1px;
 | 
			
		||||
  flex: 1;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: flex-end;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1620
									
								
								static/js/novnc/app/ui.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										270
									
								
								static/js/novnc/app/webutil.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,270 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.init_logging = init_logging;
 | 
			
		||||
exports.getQueryVar = getQueryVar;
 | 
			
		||||
exports.getHashVar = getHashVar;
 | 
			
		||||
exports.getConfigVar = getConfigVar;
 | 
			
		||||
exports.createCookie = createCookie;
 | 
			
		||||
exports.readCookie = readCookie;
 | 
			
		||||
exports.eraseCookie = eraseCookie;
 | 
			
		||||
exports.initSettings = initSettings;
 | 
			
		||||
exports.writeSetting = writeSetting;
 | 
			
		||||
exports.readSetting = readSetting;
 | 
			
		||||
exports.eraseSetting = eraseSetting;
 | 
			
		||||
exports.injectParamIfMissing = injectParamIfMissing;
 | 
			
		||||
exports.fetchJSON = fetchJSON;
 | 
			
		||||
 | 
			
		||||
var _logging = require("../core/util/logging.js");
 | 
			
		||||
 | 
			
		||||
// init log level reading the logging HTTP param
 | 
			
		||||
function init_logging(level) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    if (typeof level !== "undefined") {
 | 
			
		||||
        (0, _logging.init_logging)(level);
 | 
			
		||||
    } else {
 | 
			
		||||
        var param = document.location.href.match(/logging=([A-Za-z0-9\._\-]*)/);
 | 
			
		||||
        (0, _logging.init_logging)(param || undefined);
 | 
			
		||||
    }
 | 
			
		||||
} /*
 | 
			
		||||
   * 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.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
// Read a query string variable
 | 
			
		||||
function getQueryVar(name, defVal) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Read a hash fragment variable
 | 
			
		||||
function getHashVar(name, defVal) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    var re = new RegExp('.*[&#]' + name + '=([^&]*)'),
 | 
			
		||||
        match = document.location.hash.match(re);
 | 
			
		||||
    if (typeof defVal === 'undefined') {
 | 
			
		||||
        defVal = null;
 | 
			
		||||
    }
 | 
			
		||||
    if (match) {
 | 
			
		||||
        return decodeURIComponent(match[1]);
 | 
			
		||||
    } else {
 | 
			
		||||
        return defVal;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Read a variable from the fragment or the query string
 | 
			
		||||
// Fragment takes precedence
 | 
			
		||||
function getConfigVar(name, defVal) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    var val = getHashVar(name);
 | 
			
		||||
    if (val === null) {
 | 
			
		||||
        val = getQueryVar(name, defVal);
 | 
			
		||||
    }
 | 
			
		||||
    return val;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// No days means only for this browser session
 | 
			
		||||
function createCookie(name, value, days) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    var date, expires;
 | 
			
		||||
    if (days) {
 | 
			
		||||
        date = new Date();
 | 
			
		||||
        date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
 | 
			
		||||
        expires = "; expires=" + date.toGMTString();
 | 
			
		||||
    } else {
 | 
			
		||||
        expires = "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var secure;
 | 
			
		||||
    if (document.location.protocol === "https:") {
 | 
			
		||||
        secure = "; secure";
 | 
			
		||||
    } else {
 | 
			
		||||
        secure = "";
 | 
			
		||||
    }
 | 
			
		||||
    document.cookie = name + "=" + value + expires + "; path=/" + secure;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function readCookie(name, defaultValue) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    var nameEQ = name + "=",
 | 
			
		||||
        ca = document.cookie.split(';');
 | 
			
		||||
 | 
			
		||||
    for (var i = 0; i < ca.length; i += 1) {
 | 
			
		||||
        var 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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function eraseCookie(name) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    createCookie(name, "", -1);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Setting handling.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
var settings = {};
 | 
			
		||||
 | 
			
		||||
function initSettings(callback /*, ...callbackArgs */) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    var callbackArgs = Array.prototype.slice.call(arguments, 1);
 | 
			
		||||
    if (window.chrome && window.chrome.storage) {
 | 
			
		||||
        window.chrome.storage.sync.get(function (cfg) {
 | 
			
		||||
            settings = cfg;
 | 
			
		||||
            if (callback) {
 | 
			
		||||
                callback.apply(this, callbackArgs);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    } else {
 | 
			
		||||
        // No-op
 | 
			
		||||
        if (callback) {
 | 
			
		||||
            callback.apply(this, callbackArgs);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// No days means only for this browser session
 | 
			
		||||
function writeSetting(name, value) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    if (window.chrome && window.chrome.storage) {
 | 
			
		||||
        if (settings[name] !== value) {
 | 
			
		||||
            settings[name] = value;
 | 
			
		||||
            window.chrome.storage.sync.set(settings);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        localStorage.setItem(name, value);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function readSetting(name, defaultValue) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    var value;
 | 
			
		||||
    if (window.chrome && window.chrome.storage) {
 | 
			
		||||
        value = settings[name];
 | 
			
		||||
    } else {
 | 
			
		||||
        value = localStorage.getItem(name);
 | 
			
		||||
    }
 | 
			
		||||
    if (typeof value === "undefined") {
 | 
			
		||||
        value = null;
 | 
			
		||||
    }
 | 
			
		||||
    if (value === null && typeof defaultValue !== "undefined") {
 | 
			
		||||
        return defaultValue;
 | 
			
		||||
    } else {
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function eraseSetting(name) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    if (window.chrome && window.chrome.storage) {
 | 
			
		||||
        window.chrome.storage.sync.remove(name);
 | 
			
		||||
        delete settings[name];
 | 
			
		||||
    } else {
 | 
			
		||||
        localStorage.removeItem(name);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function injectParamIfMissing(path, param, value) {
 | 
			
		||||
    // force pretend that we're dealing with a relative path
 | 
			
		||||
    // (assume that we wanted an extra if we pass one in)
 | 
			
		||||
    path = "/" + path;
 | 
			
		||||
 | 
			
		||||
    var elem = document.createElement('a');
 | 
			
		||||
    elem.href = path;
 | 
			
		||||
 | 
			
		||||
    var param_eq = encodeURIComponent(param) + "=";
 | 
			
		||||
    var query;
 | 
			
		||||
    if (elem.search) {
 | 
			
		||||
        query = elem.search.slice(1).split('&');
 | 
			
		||||
    } else {
 | 
			
		||||
        query = [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!query.some(function (v) {
 | 
			
		||||
        return v.startsWith(param_eq);
 | 
			
		||||
    })) {
 | 
			
		||||
        query.push(param_eq + encodeURIComponent(value));
 | 
			
		||||
        elem.search = "?" + query.join("&");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // some browsers (e.g. IE11) may occasionally omit the leading slash
 | 
			
		||||
    // in the elem.pathname string. Handle that case gracefully.
 | 
			
		||||
    if (elem.pathname.charAt(0) == "/") {
 | 
			
		||||
        return elem.pathname.slice(1) + elem.search + elem.hash;
 | 
			
		||||
    } else {
 | 
			
		||||
        return elem.pathname + elem.search + elem.hash;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// sadly, we can't use the Fetch API until we decide to drop
 | 
			
		||||
// IE11 support or polyfill promises and fetch in IE11.
 | 
			
		||||
// resolve will receive an object on success, while reject
 | 
			
		||||
// will receive either an event or an error on failure.
 | 
			
		||||
function fetchJSON(path, resolve, reject) {
 | 
			
		||||
    // NB: IE11 doesn't support JSON as a responseType
 | 
			
		||||
    var req = new XMLHttpRequest();
 | 
			
		||||
    req.open('GET', path);
 | 
			
		||||
 | 
			
		||||
    req.onload = function () {
 | 
			
		||||
        if (req.status === 200) {
 | 
			
		||||
            try {
 | 
			
		||||
                var resObj = JSON.parse(req.responseText);
 | 
			
		||||
            } catch (err) {
 | 
			
		||||
                reject(err);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            resolve(resObj);
 | 
			
		||||
        } else {
 | 
			
		||||
            reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status));
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    req.onerror = function (evt) {
 | 
			
		||||
        reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    req.ontimeout = function (evt) {
 | 
			
		||||
        reject(new Error("XHR timed out while trying to load '" + path + "'"));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    req.send();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,405 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * noVNC base CSS
 | 
			
		||||
 * Copyright (C) 2012 Joel Martin
 | 
			
		||||
 * 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_connectTimeout {
 | 
			
		||||
  width: 30px;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_path {
 | 
			
		||||
  width: 100px;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_connect_button {
 | 
			
		||||
  width: 110px;
 | 
			
		||||
  float:right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#noVNC_view_drag_button {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
#sendCtrlAltDelButton {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_mobile_buttons {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC-buttons-left {
 | 
			
		||||
  float: left;
 | 
			
		||||
  padding-left:10px;
 | 
			
		||||
  padding-top:4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC-buttons-right {
 | 
			
		||||
  float:right;
 | 
			
		||||
  right: 0px;
 | 
			
		||||
  padding-right:10px;
 | 
			
		||||
  padding-top:4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_status_bar {
 | 
			
		||||
  margin-top: 0px;
 | 
			
		||||
  padding: 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_status_bar div {
 | 
			
		||||
  font-size: 12px;
 | 
			
		||||
  padding-top: 4px;
 | 
			
		||||
  width:100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_status {
 | 
			
		||||
  height:20px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_settings_menu {
 | 
			
		||||
  margin: 3px;
 | 
			
		||||
  text-align: left;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_settings_menu ul {
 | 
			
		||||
  list-style: none;
 | 
			
		||||
  margin: 0px;
 | 
			
		||||
  padding: 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_apply {
 | 
			
		||||
  float:right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_status_normal {
 | 
			
		||||
  background: #eee;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_status_error {
 | 
			
		||||
  background: #f44;
 | 
			
		||||
}
 | 
			
		||||
.noVNC_status_warn {
 | 
			
		||||
  background: #ff4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 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: 44px;
 | 
			
		||||
}
 | 
			
		||||
#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:77px;
 | 
			
		||||
  right:20px;
 | 
			
		||||
  position:fixed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_controls {
 | 
			
		||||
  display:none;
 | 
			
		||||
  margin-top:77px;
 | 
			
		||||
  right:12px;
 | 
			
		||||
  position:fixed;
 | 
			
		||||
}
 | 
			
		||||
#noVNC_controls.top:after  {
 | 
			
		||||
  right:15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#noVNC_description {
 | 
			
		||||
  display:none;
 | 
			
		||||
  position:fixed;
 | 
			
		||||
 | 
			
		||||
  margin-top:77px;
 | 
			
		||||
  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_clipboard {
 | 
			
		||||
  display:none;
 | 
			
		||||
  margin-top:77px;
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.noVNC_status_warn {
 | 
			
		||||
  background-color:yellow;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Advanced Styling
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Control bar */
 | 
			
		||||
#noVNC-control-bar {
 | 
			
		||||
  position:fixed;
 | 
			
		||||
  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 */
 | 
			
		||||
 | 
			
		||||
  display:block;
 | 
			
		||||
  height:44px;
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 481px) and (max-width: 640px) {
 | 
			
		||||
  .noVNC_status_button {
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
  }
 | 
			
		||||
  #noVNC_clipboard_text {
 | 
			
		||||
    width: 410px;
 | 
			
		||||
  }
 | 
			
		||||
  #noVNC_logo {
 | 
			
		||||
    font-size: 150px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 321px) and (max-width: 480px) {
 | 
			
		||||
  .noVNC_status_button {
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
  }
 | 
			
		||||
  #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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,115 +0,0 @@
 | 
			
		|||
/* 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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,52 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * noVNC black CSS
 | 
			
		||||
 * Copyright (C) 2012 Joel Martin
 | 
			
		||||
 * 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-control-bar {
 | 
			
		||||
  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 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.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 */
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,33 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * noVNC blue CSS
 | 
			
		||||
 * Copyright (C) 2012 Joel Martin
 | 
			
		||||
 * 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-control-bar {
 | 
			
		||||
  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%
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.triangle-right {
 | 
			
		||||
  border:2px solid #fff;
 | 
			
		||||
  background:#04073d;
 | 
			
		||||
  color:#fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#keyboardinput {
 | 
			
		||||
  background-color:#04073d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,321 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
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);
 | 
			
		||||
							
								
								
									
										114
									
								
								static/js/novnc/core/base64.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var _logging = require('./util/logging.js');
 | 
			
		||||
 | 
			
		||||
var Log = _interopRequireWildcard(_logging);
 | 
			
		||||
 | 
			
		||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 | 
			
		||||
 | 
			
		||||
exports.default = {
 | 
			
		||||
    /* Convert data (an array of integers) to a Base64 string. */
 | 
			
		||||
    toBase64Table: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''),
 | 
			
		||||
    base64Pad: '=',
 | 
			
		||||
 | 
			
		||||
    encode: function (data) {
 | 
			
		||||
        "use strict";
 | 
			
		||||
 | 
			
		||||
        var result = '';
 | 
			
		||||
        var toBase64Table = this.toBase64Table;
 | 
			
		||||
        var length = data.length;
 | 
			
		||||
        var lengthpad = length % 3;
 | 
			
		||||
        // Convert every three bytes to 4 ascii characters.
 | 
			
		||||
 | 
			
		||||
        for (var 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];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
 | 
			
		||||
        var j = 0;
 | 
			
		||||
        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 = this.toBinaryTable;
 | 
			
		||||
        var base64Pad = this.base64Pad;
 | 
			
		||||
        var result, result_length;
 | 
			
		||||
        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.
 | 
			
		||||
        for (var idx = 0, i = offset; i < data.length; i++) {
 | 
			
		||||
            var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
 | 
			
		||||
            var padding = data.charAt(i) === base64Pad;
 | 
			
		||||
            // Skip illegal characters and whitespace
 | 
			
		||||
            if (c === -1) {
 | 
			
		||||
                Log.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;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If there are any bits left, the base64 string was corrupted
 | 
			
		||||
        if (leftbits) {
 | 
			
		||||
            err = new Error('Corrupted base64 string');
 | 
			
		||||
            err.name = 'Base64-Error';
 | 
			
		||||
            throw err;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}; /* End of Base64 namespace */
 | 
			
		||||
/* 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
 | 
			
		||||
							
								
								
									
										283
									
								
								static/js/novnc/core/des.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,283 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.default = DES;
 | 
			
		||||
/*
 | 
			
		||||
 * 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 <dzimm@widget.com>, 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 <jef@acme.com>.  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/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
function DES(passwd) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    // 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 << m) !== 0 ? 1 : 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (i = 0; i < 16; ++i) {
 | 
			
		||||
            m = i << 1;
 | 
			
		||||
            n = m + 1;
 | 
			
		||||
            kn[m] = kn[n] = 0;
 | 
			
		||||
            for (o = 28; o < 59; o += 28) {
 | 
			
		||||
                for (j = o - 28; j < o; ++j) {
 | 
			
		||||
                    l = j + totrot[i];
 | 
			
		||||
                    if (l < o) {
 | 
			
		||||
                        pcr[j] = pc1m[l];
 | 
			
		||||
                    } else {
 | 
			
		||||
                        pcr[j] = pc1m[l - 28];
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            for (j = 0; j < 24; ++j) {
 | 
			
		||||
                if (pcr[PC2[j]] !== 0) {
 | 
			
		||||
                    kn[m] |= 1 << 23 - j;
 | 
			
		||||
                }
 | 
			
		||||
                if (pcr[PC2[j + 24]] !== 0) {
 | 
			
		||||
                    kn[n] |= 1 << 23 - j;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // cookey
 | 
			
		||||
        for (i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
 | 
			
		||||
            raw0 = kn[rawi++];
 | 
			
		||||
            raw1 = kn[rawi++];
 | 
			
		||||
            keys[KnLi] = (raw0 & 0x00fc0000) << 6;
 | 
			
		||||
            keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
 | 
			
		||||
            keys[KnLi] |= (raw1 & 0x00fc0000) >>> 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
 | 
			
		||||
							
								
								
									
										710
									
								
								static/js/novnc/core/display.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,710 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.default = Display;
 | 
			
		||||
 | 
			
		||||
var _logging = require("./util/logging.js");
 | 
			
		||||
 | 
			
		||||
var Log = _interopRequireWildcard(_logging);
 | 
			
		||||
 | 
			
		||||
var _base = require("./base64.js");
 | 
			
		||||
 | 
			
		||||
var _base2 = _interopRequireDefault(_base);
 | 
			
		||||
 | 
			
		||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
			
		||||
 | 
			
		||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * noVNC: HTML5 VNC client
 | 
			
		||||
 * Copyright (C) 2012 Joel Martin
 | 
			
		||||
 * Copyright (C) 2015 Samuel Mannehed for Cendio AB
 | 
			
		||||
 * Licensed under MPL 2.0 (see LICENSE.txt)
 | 
			
		||||
 *
 | 
			
		||||
 * See README.md for usage and integration instructions.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
function Display(target) {
 | 
			
		||||
    this._drawCtx = null;
 | 
			
		||||
    this._c_forceCanvas = false;
 | 
			
		||||
 | 
			
		||||
    this._renderQ = []; // queue drawing actions for in-oder rendering
 | 
			
		||||
    this._flushing = false;
 | 
			
		||||
 | 
			
		||||
    // the full frame buffer (logical canvas) size
 | 
			
		||||
    this._fb_width = 0;
 | 
			
		||||
    this._fb_height = 0;
 | 
			
		||||
 | 
			
		||||
    this._prevDrawStyle = "";
 | 
			
		||||
    this._tile = null;
 | 
			
		||||
    this._tile16x16 = null;
 | 
			
		||||
    this._tile_x = 0;
 | 
			
		||||
    this._tile_y = 0;
 | 
			
		||||
 | 
			
		||||
    Log.Debug(">> Display.constructor");
 | 
			
		||||
 | 
			
		||||
    // The visible canvas
 | 
			
		||||
    this._target = target;
 | 
			
		||||
 | 
			
		||||
    if (!this._target) {
 | 
			
		||||
        throw new Error("Target must be set");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof this._target === 'string') {
 | 
			
		||||
        throw new Error('target must be a DOM element');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!this._target.getContext) {
 | 
			
		||||
        throw new Error("no getContext method");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._targetCtx = this._target.getContext('2d');
 | 
			
		||||
 | 
			
		||||
    // the visible canvas viewport (i.e. what actually gets seen)
 | 
			
		||||
    this._viewportLoc = { 'x': 0, 'y': 0, 'w': this._target.width, 'h': this._target.height };
 | 
			
		||||
 | 
			
		||||
    // The hidden canvas, where we do the actual rendering
 | 
			
		||||
    this._backbuffer = document.createElement('canvas');
 | 
			
		||||
    this._drawCtx = this._backbuffer.getContext('2d');
 | 
			
		||||
 | 
			
		||||
    this._damageBounds = { left: 0, top: 0,
 | 
			
		||||
        right: this._backbuffer.width,
 | 
			
		||||
        bottom: this._backbuffer.height };
 | 
			
		||||
 | 
			
		||||
    Log.Debug("User Agent: " + navigator.userAgent);
 | 
			
		||||
 | 
			
		||||
    this.clear();
 | 
			
		||||
 | 
			
		||||
    // Check canvas features
 | 
			
		||||
    if (!('createImageData' in this._drawCtx)) {
 | 
			
		||||
        throw new Error("Canvas does not support createImageData");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._tile16x16 = this._drawCtx.createImageData(16, 16);
 | 
			
		||||
    Log.Debug("<< Display.constructor");
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var SUPPORTS_IMAGEDATA_CONSTRUCTOR = false;
 | 
			
		||||
try {
 | 
			
		||||
    new ImageData(new Uint8ClampedArray(4), 1, 1);
 | 
			
		||||
    SUPPORTS_IMAGEDATA_CONSTRUCTOR = true;
 | 
			
		||||
} catch (ex) {
 | 
			
		||||
    // ignore failure
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Display.prototype = {
 | 
			
		||||
    // ===== PROPERTIES =====
 | 
			
		||||
 | 
			
		||||
    _scale: 1.0,
 | 
			
		||||
    get scale() {
 | 
			
		||||
        return this._scale;
 | 
			
		||||
    },
 | 
			
		||||
    set scale(scale) {
 | 
			
		||||
        this._rescale(scale);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _clipViewport: false,
 | 
			
		||||
    get clipViewport() {
 | 
			
		||||
        return this._clipViewport;
 | 
			
		||||
    },
 | 
			
		||||
    set clipViewport(viewport) {
 | 
			
		||||
        this._clipViewport = viewport;
 | 
			
		||||
        // May need to readjust the viewport dimensions
 | 
			
		||||
        var vp = this._viewportLoc;
 | 
			
		||||
        this.viewportChangeSize(vp.w, vp.h);
 | 
			
		||||
        this.viewportChangePos(0, 0);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get width() {
 | 
			
		||||
        return this._fb_width;
 | 
			
		||||
    },
 | 
			
		||||
    get height() {
 | 
			
		||||
        return this._fb_height;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    logo: null,
 | 
			
		||||
 | 
			
		||||
    // ===== EVENT HANDLERS =====
 | 
			
		||||
 | 
			
		||||
    onflush: function () {}, // A flush request has finished
 | 
			
		||||
 | 
			
		||||
    // ===== PUBLIC METHODS =====
 | 
			
		||||
 | 
			
		||||
    viewportChangePos: function (deltaX, deltaY) {
 | 
			
		||||
        var vp = this._viewportLoc;
 | 
			
		||||
        deltaX = Math.floor(deltaX);
 | 
			
		||||
        deltaY = Math.floor(deltaY);
 | 
			
		||||
 | 
			
		||||
        if (!this._clipViewport) {
 | 
			
		||||
            deltaX = -vp.w; // clamped later of out of bounds
 | 
			
		||||
            deltaY = -vp.h;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var vx2 = vp.x + vp.w - 1;
 | 
			
		||||
        var vy2 = vp.y + vp.h - 1;
 | 
			
		||||
 | 
			
		||||
        // Position change
 | 
			
		||||
 | 
			
		||||
        if (deltaX < 0 && vp.x + deltaX < 0) {
 | 
			
		||||
            deltaX = -vp.x;
 | 
			
		||||
        }
 | 
			
		||||
        if (vx2 + deltaX >= this._fb_width) {
 | 
			
		||||
            deltaX -= vx2 + deltaX - this._fb_width + 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (vp.y + deltaY < 0) {
 | 
			
		||||
            deltaY = -vp.y;
 | 
			
		||||
        }
 | 
			
		||||
        if (vy2 + deltaY >= this._fb_height) {
 | 
			
		||||
            deltaY -= vy2 + deltaY - this._fb_height + 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (deltaX === 0 && deltaY === 0) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        Log.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY);
 | 
			
		||||
 | 
			
		||||
        vp.x += deltaX;
 | 
			
		||||
        vp.y += deltaY;
 | 
			
		||||
 | 
			
		||||
        this._damage(vp.x, vp.y, vp.w, vp.h);
 | 
			
		||||
 | 
			
		||||
        this.flip();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    viewportChangeSize: function (width, height) {
 | 
			
		||||
 | 
			
		||||
        if (!this._clipViewport || typeof width === "undefined" || typeof height === "undefined") {
 | 
			
		||||
 | 
			
		||||
            Log.Debug("Setting viewport to full display region");
 | 
			
		||||
            width = this._fb_width;
 | 
			
		||||
            height = this._fb_height;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (width > this._fb_width) {
 | 
			
		||||
            width = this._fb_width;
 | 
			
		||||
        }
 | 
			
		||||
        if (height > this._fb_height) {
 | 
			
		||||
            height = this._fb_height;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var vp = this._viewportLoc;
 | 
			
		||||
        if (vp.w !== width || vp.h !== height) {
 | 
			
		||||
            vp.w = width;
 | 
			
		||||
            vp.h = height;
 | 
			
		||||
 | 
			
		||||
            var canvas = this._target;
 | 
			
		||||
            canvas.width = width;
 | 
			
		||||
            canvas.height = height;
 | 
			
		||||
 | 
			
		||||
            // The position might need to be updated if we've grown
 | 
			
		||||
            this.viewportChangePos(0, 0);
 | 
			
		||||
 | 
			
		||||
            this._damage(vp.x, vp.y, vp.w, vp.h);
 | 
			
		||||
            this.flip();
 | 
			
		||||
 | 
			
		||||
            // Update the visible size of the target canvas
 | 
			
		||||
            this._rescale(this._scale);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    absX: function (x) {
 | 
			
		||||
        return x / this._scale + this._viewportLoc.x;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    absY: function (y) {
 | 
			
		||||
        return y / this._scale + this._viewportLoc.y;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    resize: function (width, height) {
 | 
			
		||||
        this._prevDrawStyle = "";
 | 
			
		||||
 | 
			
		||||
        this._fb_width = width;
 | 
			
		||||
        this._fb_height = height;
 | 
			
		||||
 | 
			
		||||
        var canvas = this._backbuffer;
 | 
			
		||||
        if (canvas.width !== width || canvas.height !== height) {
 | 
			
		||||
 | 
			
		||||
            // We have to save the canvas data since changing the size will clear it
 | 
			
		||||
            var saveImg = null;
 | 
			
		||||
            if (canvas.width > 0 && canvas.height > 0) {
 | 
			
		||||
                saveImg = this._drawCtx.getImageData(0, 0, canvas.width, canvas.height);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (canvas.width !== width) {
 | 
			
		||||
                canvas.width = width;
 | 
			
		||||
            }
 | 
			
		||||
            if (canvas.height !== height) {
 | 
			
		||||
                canvas.height = height;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (saveImg) {
 | 
			
		||||
                this._drawCtx.putImageData(saveImg, 0, 0);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Readjust the viewport as it may be incorrectly sized
 | 
			
		||||
        // and positioned
 | 
			
		||||
        var vp = this._viewportLoc;
 | 
			
		||||
        this.viewportChangeSize(vp.w, vp.h);
 | 
			
		||||
        this.viewportChangePos(0, 0);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Track what parts of the visible canvas that need updating
 | 
			
		||||
    _damage: function (x, y, w, h) {
 | 
			
		||||
        if (x < this._damageBounds.left) {
 | 
			
		||||
            this._damageBounds.left = x;
 | 
			
		||||
        }
 | 
			
		||||
        if (y < this._damageBounds.top) {
 | 
			
		||||
            this._damageBounds.top = y;
 | 
			
		||||
        }
 | 
			
		||||
        if (x + w > this._damageBounds.right) {
 | 
			
		||||
            this._damageBounds.right = x + w;
 | 
			
		||||
        }
 | 
			
		||||
        if (y + h > this._damageBounds.bottom) {
 | 
			
		||||
            this._damageBounds.bottom = y + h;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Update the visible canvas with the contents of the
 | 
			
		||||
    // rendering canvas
 | 
			
		||||
    flip: function (from_queue) {
 | 
			
		||||
        if (this._renderQ.length !== 0 && !from_queue) {
 | 
			
		||||
            this._renderQ_push({
 | 
			
		||||
                'type': 'flip'
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            var x, y, vx, vy, w, h;
 | 
			
		||||
 | 
			
		||||
            x = this._damageBounds.left;
 | 
			
		||||
            y = this._damageBounds.top;
 | 
			
		||||
            w = this._damageBounds.right - x;
 | 
			
		||||
            h = this._damageBounds.bottom - y;
 | 
			
		||||
 | 
			
		||||
            vx = x - this._viewportLoc.x;
 | 
			
		||||
            vy = y - this._viewportLoc.y;
 | 
			
		||||
 | 
			
		||||
            if (vx < 0) {
 | 
			
		||||
                w += vx;
 | 
			
		||||
                x -= vx;
 | 
			
		||||
                vx = 0;
 | 
			
		||||
            }
 | 
			
		||||
            if (vy < 0) {
 | 
			
		||||
                h += vy;
 | 
			
		||||
                y -= vy;
 | 
			
		||||
                vy = 0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (vx + w > this._viewportLoc.w) {
 | 
			
		||||
                w = this._viewportLoc.w - vx;
 | 
			
		||||
            }
 | 
			
		||||
            if (vy + h > this._viewportLoc.h) {
 | 
			
		||||
                h = this._viewportLoc.h - vy;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (w > 0 && h > 0) {
 | 
			
		||||
                // FIXME: We may need to disable image smoothing here
 | 
			
		||||
                //        as well (see copyImage()), but we haven't
 | 
			
		||||
                //        noticed any problem yet.
 | 
			
		||||
                this._targetCtx.drawImage(this._backbuffer, x, y, w, h, vx, vy, w, h);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._damageBounds.left = this._damageBounds.top = 65535;
 | 
			
		||||
            this._damageBounds.right = this._damageBounds.bottom = 0;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    clear: function () {
 | 
			
		||||
        if (this._logo) {
 | 
			
		||||
            this.resize(this._logo.width, this._logo.height);
 | 
			
		||||
            this.imageRect(0, 0, this._logo.type, this._logo.data);
 | 
			
		||||
        } else {
 | 
			
		||||
            this.resize(240, 20);
 | 
			
		||||
            this._drawCtx.clearRect(0, 0, this._fb_width, this._fb_height);
 | 
			
		||||
        }
 | 
			
		||||
        this.flip();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    pending: function () {
 | 
			
		||||
        return this._renderQ.length > 0;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    flush: function () {
 | 
			
		||||
        if (this._renderQ.length === 0) {
 | 
			
		||||
            this.onflush();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._flushing = true;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    fillRect: function (x, y, width, height, color, from_queue) {
 | 
			
		||||
        if (this._renderQ.length !== 0 && !from_queue) {
 | 
			
		||||
            this._renderQ_push({
 | 
			
		||||
                'type': 'fill',
 | 
			
		||||
                'x': x,
 | 
			
		||||
                'y': y,
 | 
			
		||||
                'width': width,
 | 
			
		||||
                'height': height,
 | 
			
		||||
                'color': color
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._setFillColor(color);
 | 
			
		||||
            this._drawCtx.fillRect(x, y, width, height);
 | 
			
		||||
            this._damage(x, y, width, height);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    copyImage: function (old_x, old_y, new_x, new_y, w, h, from_queue) {
 | 
			
		||||
        if (this._renderQ.length !== 0 && !from_queue) {
 | 
			
		||||
            this._renderQ_push({
 | 
			
		||||
                'type': 'copy',
 | 
			
		||||
                'old_x': old_x,
 | 
			
		||||
                'old_y': old_y,
 | 
			
		||||
                'x': new_x,
 | 
			
		||||
                'y': new_y,
 | 
			
		||||
                'width': w,
 | 
			
		||||
                'height': h
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            // Due to this bug among others [1] we need to disable the image-smoothing to
 | 
			
		||||
            // avoid getting a blur effect when copying data.
 | 
			
		||||
            //
 | 
			
		||||
            // 1. https://bugzilla.mozilla.org/show_bug.cgi?id=1194719
 | 
			
		||||
            //
 | 
			
		||||
            // We need to set these every time since all properties are reset
 | 
			
		||||
            // when the the size is changed
 | 
			
		||||
            this._drawCtx.mozImageSmoothingEnabled = false;
 | 
			
		||||
            this._drawCtx.webkitImageSmoothingEnabled = false;
 | 
			
		||||
            this._drawCtx.msImageSmoothingEnabled = false;
 | 
			
		||||
            this._drawCtx.imageSmoothingEnabled = false;
 | 
			
		||||
 | 
			
		||||
            this._drawCtx.drawImage(this._backbuffer, old_x, old_y, w, h, new_x, new_y, w, h);
 | 
			
		||||
            this._damage(new_x, new_y, w, h);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    imageRect: function (x, y, mime, arr) {
 | 
			
		||||
        var img = new Image();
 | 
			
		||||
        img.src = "data: " + mime + ";base64," + _base2.default.encode(arr);
 | 
			
		||||
        this._renderQ_push({
 | 
			
		||||
            'type': 'img',
 | 
			
		||||
            'img': img,
 | 
			
		||||
            'x': x,
 | 
			
		||||
            'y': y
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // start updating a tile
 | 
			
		||||
    startTile: function (x, y, width, height, color) {
 | 
			
		||||
        this._tile_x = x;
 | 
			
		||||
        this._tile_y = y;
 | 
			
		||||
        if (width === 16 && height === 16) {
 | 
			
		||||
            this._tile = this._tile16x16;
 | 
			
		||||
        } else {
 | 
			
		||||
            this._tile = this._drawCtx.createImageData(width, height);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var red = color[2];
 | 
			
		||||
        var green = color[1];
 | 
			
		||||
        var blue = color[0];
 | 
			
		||||
 | 
			
		||||
        var data = this._tile.data;
 | 
			
		||||
        for (var i = 0; i < width * height * 4; i += 4) {
 | 
			
		||||
            data[i] = red;
 | 
			
		||||
            data[i + 1] = green;
 | 
			
		||||
            data[i + 2] = blue;
 | 
			
		||||
            data[i + 3] = 255;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // update sub-rectangle of the current tile
 | 
			
		||||
    subTile: function (x, y, w, h, color) {
 | 
			
		||||
        var red = color[2];
 | 
			
		||||
        var green = color[1];
 | 
			
		||||
        var blue = color[0];
 | 
			
		||||
        var xend = x + w;
 | 
			
		||||
        var yend = y + h;
 | 
			
		||||
 | 
			
		||||
        var data = this._tile.data;
 | 
			
		||||
        var width = this._tile.width;
 | 
			
		||||
        for (var j = y; j < yend; j++) {
 | 
			
		||||
            for (var i = x; i < xend; i++) {
 | 
			
		||||
                var p = (i + j * width) * 4;
 | 
			
		||||
                data[p] = red;
 | 
			
		||||
                data[p + 1] = green;
 | 
			
		||||
                data[p + 2] = blue;
 | 
			
		||||
                data[p + 3] = 255;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // draw the current tile to the screen
 | 
			
		||||
    finishTile: function () {
 | 
			
		||||
        this._drawCtx.putImageData(this._tile, this._tile_x, this._tile_y);
 | 
			
		||||
        this._damage(this._tile_x, this._tile_y, this._tile.width, this._tile.height);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    blitImage: function (x, y, width, height, arr, offset, from_queue) {
 | 
			
		||||
        if (this._renderQ.length !== 0 && !from_queue) {
 | 
			
		||||
            // NB(directxman12): it's technically more performant here to use preallocated arrays,
 | 
			
		||||
            // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
 | 
			
		||||
            // this probably isn't getting called *nearly* as much
 | 
			
		||||
            var new_arr = new Uint8Array(width * height * 4);
 | 
			
		||||
            new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length));
 | 
			
		||||
            this._renderQ_push({
 | 
			
		||||
                'type': 'blit',
 | 
			
		||||
                'data': new_arr,
 | 
			
		||||
                'x': x,
 | 
			
		||||
                'y': y,
 | 
			
		||||
                'width': width,
 | 
			
		||||
                'height': height
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._bgrxImageData(x, y, width, height, arr, offset);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    blitRgbImage: function (x, y, width, height, arr, offset, from_queue) {
 | 
			
		||||
        if (this._renderQ.length !== 0 && !from_queue) {
 | 
			
		||||
            // NB(directxman12): it's technically more performant here to use preallocated arrays,
 | 
			
		||||
            // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
 | 
			
		||||
            // this probably isn't getting called *nearly* as much
 | 
			
		||||
            var new_arr = new Uint8Array(width * height * 3);
 | 
			
		||||
            new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length));
 | 
			
		||||
            this._renderQ_push({
 | 
			
		||||
                'type': 'blitRgb',
 | 
			
		||||
                'data': new_arr,
 | 
			
		||||
                'x': x,
 | 
			
		||||
                'y': y,
 | 
			
		||||
                'width': width,
 | 
			
		||||
                'height': height
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._rgbImageData(x, y, width, height, arr, offset);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    blitRgbxImage: function (x, y, width, height, arr, offset, from_queue) {
 | 
			
		||||
        if (this._renderQ.length !== 0 && !from_queue) {
 | 
			
		||||
            // NB(directxman12): it's technically more performant here to use preallocated arrays,
 | 
			
		||||
            // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
 | 
			
		||||
            // this probably isn't getting called *nearly* as much
 | 
			
		||||
            var new_arr = new Uint8Array(width * height * 4);
 | 
			
		||||
            new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length));
 | 
			
		||||
            this._renderQ_push({
 | 
			
		||||
                'type': 'blitRgbx',
 | 
			
		||||
                'data': new_arr,
 | 
			
		||||
                'x': x,
 | 
			
		||||
                'y': y,
 | 
			
		||||
                'width': width,
 | 
			
		||||
                'height': height
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._rgbxImageData(x, y, width, height, arr, offset);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    drawImage: function (img, x, y) {
 | 
			
		||||
        this._drawCtx.drawImage(img, x, y);
 | 
			
		||||
        this._damage(x, y, img.width, img.height);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    changeCursor: function (pixels, mask, hotx, hoty, w, h) {
 | 
			
		||||
        Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    defaultCursor: function () {
 | 
			
		||||
        this._target.style.cursor = "default";
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    disableLocalCursor: function () {
 | 
			
		||||
        this._target.style.cursor = "none";
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    autoscale: function (containerWidth, containerHeight) {
 | 
			
		||||
        var vp = this._viewportLoc;
 | 
			
		||||
        var targetAspectRatio = containerWidth / containerHeight;
 | 
			
		||||
        var fbAspectRatio = vp.w / vp.h;
 | 
			
		||||
 | 
			
		||||
        var scaleRatio;
 | 
			
		||||
        if (fbAspectRatio >= targetAspectRatio) {
 | 
			
		||||
            scaleRatio = containerWidth / vp.w;
 | 
			
		||||
        } else {
 | 
			
		||||
            scaleRatio = containerHeight / vp.h;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._rescale(scaleRatio);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // ===== PRIVATE METHODS =====
 | 
			
		||||
 | 
			
		||||
    _rescale: function (factor) {
 | 
			
		||||
        this._scale = factor;
 | 
			
		||||
        var vp = this._viewportLoc;
 | 
			
		||||
 | 
			
		||||
        // NB(directxman12): If you set the width directly, or set the
 | 
			
		||||
        //                   style width to a number, the canvas is cleared.
 | 
			
		||||
        //                   However, if you set the style width to a string
 | 
			
		||||
        //                   ('NNNpx'), the canvas is scaled without clearing.
 | 
			
		||||
        var width = Math.round(factor * vp.w) + 'px';
 | 
			
		||||
        var height = Math.round(factor * vp.h) + 'px';
 | 
			
		||||
 | 
			
		||||
        if (this._target.style.width !== width || this._target.style.height !== height) {
 | 
			
		||||
            this._target.style.width = width;
 | 
			
		||||
            this._target.style.height = height;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _setFillColor: function (color) {
 | 
			
		||||
        var newStyle = 'rgb(' + color[2] + ',' + color[1] + ',' + color[0] + ')';
 | 
			
		||||
        if (newStyle !== this._prevDrawStyle) {
 | 
			
		||||
            this._drawCtx.fillStyle = newStyle;
 | 
			
		||||
            this._prevDrawStyle = newStyle;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _rgbImageData: function (x, y, width, height, arr, offset) {
 | 
			
		||||
        var img = this._drawCtx.createImageData(width, height);
 | 
			
		||||
        var data = img.data;
 | 
			
		||||
        for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 3) {
 | 
			
		||||
            data[i] = arr[j];
 | 
			
		||||
            data[i + 1] = arr[j + 1];
 | 
			
		||||
            data[i + 2] = arr[j + 2];
 | 
			
		||||
            data[i + 3] = 255; // Alpha
 | 
			
		||||
        }
 | 
			
		||||
        this._drawCtx.putImageData(img, x, y);
 | 
			
		||||
        this._damage(x, y, img.width, img.height);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _bgrxImageData: function (x, y, width, height, arr, offset) {
 | 
			
		||||
        var img = this._drawCtx.createImageData(width, height);
 | 
			
		||||
        var data = img.data;
 | 
			
		||||
        for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 4) {
 | 
			
		||||
            data[i] = arr[j + 2];
 | 
			
		||||
            data[i + 1] = arr[j + 1];
 | 
			
		||||
            data[i + 2] = arr[j];
 | 
			
		||||
            data[i + 3] = 255; // Alpha
 | 
			
		||||
        }
 | 
			
		||||
        this._drawCtx.putImageData(img, x, y);
 | 
			
		||||
        this._damage(x, y, img.width, img.height);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _rgbxImageData: function (x, y, width, height, arr, offset) {
 | 
			
		||||
        // NB(directxman12): arr must be an Type Array view
 | 
			
		||||
        var img;
 | 
			
		||||
        if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) {
 | 
			
		||||
            img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height);
 | 
			
		||||
        } else {
 | 
			
		||||
            img = this._drawCtx.createImageData(width, height);
 | 
			
		||||
            img.data.set(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4));
 | 
			
		||||
        }
 | 
			
		||||
        this._drawCtx.putImageData(img, x, y);
 | 
			
		||||
        this._damage(x, y, img.width, img.height);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _renderQ_push: function (action) {
 | 
			
		||||
        this._renderQ.push(action);
 | 
			
		||||
        if (this._renderQ.length === 1) {
 | 
			
		||||
            // If this can be rendered immediately it will be, otherwise
 | 
			
		||||
            // the scanner will wait for the relevant event
 | 
			
		||||
            this._scan_renderQ();
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _resume_renderQ: function () {
 | 
			
		||||
        // "this" is the object that is ready, not the
 | 
			
		||||
        // display object
 | 
			
		||||
        this.removeEventListener('load', this._noVNC_display._resume_renderQ);
 | 
			
		||||
        this._noVNC_display._scan_renderQ();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _scan_renderQ: function () {
 | 
			
		||||
        var ready = true;
 | 
			
		||||
        while (ready && this._renderQ.length > 0) {
 | 
			
		||||
            var a = this._renderQ[0];
 | 
			
		||||
            switch (a.type) {
 | 
			
		||||
                case 'flip':
 | 
			
		||||
                    this.flip(true);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'copy':
 | 
			
		||||
                    this.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height, true);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'fill':
 | 
			
		||||
                    this.fillRect(a.x, a.y, a.width, a.height, a.color, true);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'blit':
 | 
			
		||||
                    this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'blitRgb':
 | 
			
		||||
                    this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0, true);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'blitRgbx':
 | 
			
		||||
                    this.blitRgbxImage(a.x, a.y, a.width, a.height, a.data, 0, true);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 'img':
 | 
			
		||||
                    if (a.img.complete) {
 | 
			
		||||
                        this.drawImage(a.img, a.x, a.y);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        a.img._noVNC_display = this;
 | 
			
		||||
                        a.img.addEventListener('load', this._resume_renderQ);
 | 
			
		||||
                        // We need to wait for this image to 'load'
 | 
			
		||||
                        // to keep things in-order
 | 
			
		||||
                        ready = false;
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (ready) {
 | 
			
		||||
                this._renderQ.shift();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._renderQ.length === 0 && this._flushing) {
 | 
			
		||||
            this._flushing = false;
 | 
			
		||||
            this.onflush();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Class Methods
 | 
			
		||||
Display.changeCursor = function (target, pixels, mask, hotx, hoty, w, h) {
 | 
			
		||||
    if (w === 0 || h === 0) {
 | 
			
		||||
        target.style.cursor = 'none';
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var cur = [];
 | 
			
		||||
    var y, x;
 | 
			
		||||
    for (y = 0; y < h; y++) {
 | 
			
		||||
        for (x = 0; x < w; x++) {
 | 
			
		||||
            var idx = y * Math.ceil(w / 8) + Math.floor(x / 8);
 | 
			
		||||
            var alpha = mask[idx] << x % 8 & 0x80 ? 255 : 0;
 | 
			
		||||
            idx = (w * y + x) * 4;
 | 
			
		||||
            cur.push(pixels[idx + 2]); // red
 | 
			
		||||
            cur.push(pixels[idx + 1]); // green
 | 
			
		||||
            cur.push(pixels[idx]); // blue
 | 
			
		||||
            cur.push(alpha); // alpha
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var canvas = document.createElement('canvas');
 | 
			
		||||
    var ctx = canvas.getContext('2d');
 | 
			
		||||
 | 
			
		||||
    canvas.width = w;
 | 
			
		||||
    canvas.height = h;
 | 
			
		||||
 | 
			
		||||
    var img;
 | 
			
		||||
    if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) {
 | 
			
		||||
        img = new ImageData(new Uint8ClampedArray(cur), w, h);
 | 
			
		||||
    } else {
 | 
			
		||||
        img = ctx.createImageData(w, h);
 | 
			
		||||
        img.data.set(new Uint8ClampedArray(cur));
 | 
			
		||||
    }
 | 
			
		||||
    ctx.clearRect(0, 0, w, h);
 | 
			
		||||
    ctx.putImageData(img, 0, 0);
 | 
			
		||||
 | 
			
		||||
    var url = canvas.toDataURL();
 | 
			
		||||
    target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default';
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										52
									
								
								static/js/novnc/core/encodings.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.encodingName = encodingName;
 | 
			
		||||
/*
 | 
			
		||||
 * noVNC: HTML5 VNC client
 | 
			
		||||
 * Copyright (C) 2017 Pierre Ossman for Cendio AB
 | 
			
		||||
 * Licensed under MPL 2.0 (see LICENSE.txt)
 | 
			
		||||
 *
 | 
			
		||||
 * See README.md for usage and integration instructions.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
var encodings = exports.encodings = {
 | 
			
		||||
    encodingRaw: 0,
 | 
			
		||||
    encodingCopyRect: 1,
 | 
			
		||||
    encodingRRE: 2,
 | 
			
		||||
    encodingHextile: 5,
 | 
			
		||||
    encodingTight: 7,
 | 
			
		||||
 | 
			
		||||
    pseudoEncodingQualityLevel9: -23,
 | 
			
		||||
    pseudoEncodingQualityLevel0: -32,
 | 
			
		||||
    pseudoEncodingDesktopSize: -223,
 | 
			
		||||
    pseudoEncodingLastRect: -224,
 | 
			
		||||
    pseudoEncodingCursor: -239,
 | 
			
		||||
    pseudoEncodingQEMUExtendedKeyEvent: -258,
 | 
			
		||||
    pseudoEncodingTightPNG: -260,
 | 
			
		||||
    pseudoEncodingExtendedDesktopSize: -308,
 | 
			
		||||
    pseudoEncodingXvp: -309,
 | 
			
		||||
    pseudoEncodingFence: -312,
 | 
			
		||||
    pseudoEncodingContinuousUpdates: -313,
 | 
			
		||||
    pseudoEncodingCompressLevel9: -247,
 | 
			
		||||
    pseudoEncodingCompressLevel0: -256
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function encodingName(num) {
 | 
			
		||||
    switch (num) {
 | 
			
		||||
        case encodings.encodingRaw:
 | 
			
		||||
            return "Raw";
 | 
			
		||||
        case encodings.encodingCopyRect:
 | 
			
		||||
            return "CopyRect";
 | 
			
		||||
        case encodings.encodingRRE:
 | 
			
		||||
            return "RRE";
 | 
			
		||||
        case encodings.encodingHextile:
 | 
			
		||||
            return "Hextile";
 | 
			
		||||
        case encodings.encodingTight:
 | 
			
		||||
            return "Tight";
 | 
			
		||||
        default:
 | 
			
		||||
            return "[unknown encoding " + num + "]";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								static/js/novnc/core/inflator.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.default = Inflate;
 | 
			
		||||
 | 
			
		||||
var _inflate = require("../vendor/pako/lib/zlib/inflate.js");
 | 
			
		||||
 | 
			
		||||
var _zstream = require("../vendor/pako/lib/zlib/zstream.js");
 | 
			
		||||
 | 
			
		||||
var _zstream2 = _interopRequireDefault(_zstream);
 | 
			
		||||
 | 
			
		||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
			
		||||
 | 
			
		||||
Inflate.prototype = {
 | 
			
		||||
    inflate: function (data, flush, expected) {
 | 
			
		||||
        this.strm.input = data;
 | 
			
		||||
        this.strm.avail_in = this.strm.input.length;
 | 
			
		||||
        this.strm.next_in = 0;
 | 
			
		||||
        this.strm.next_out = 0;
 | 
			
		||||
 | 
			
		||||
        // resize our output buffer if it's too small
 | 
			
		||||
        // (we could just use multiple chunks, but that would cause an extra
 | 
			
		||||
        // allocation each time to flatten the chunks)
 | 
			
		||||
        if (expected > this.chunkSize) {
 | 
			
		||||
            this.chunkSize = expected;
 | 
			
		||||
            this.strm.output = new Uint8Array(this.chunkSize);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.strm.avail_out = this.chunkSize;
 | 
			
		||||
 | 
			
		||||
        (0, _inflate.inflate)(this.strm, flush);
 | 
			
		||||
 | 
			
		||||
        return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    reset: function () {
 | 
			
		||||
        (0, _inflate.inflateReset)(this.strm);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function Inflate() {
 | 
			
		||||
    this.strm = new _zstream2.default();
 | 
			
		||||
    this.chunkSize = 1024 * 10 * 10;
 | 
			
		||||
    this.strm.output = new Uint8Array(this.chunkSize);
 | 
			
		||||
    this.windowBits = 5;
 | 
			
		||||
 | 
			
		||||
    (0, _inflate.inflateInit)(this.strm, this.windowBits);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										315
									
								
								static/js/novnc/core/input/domkeytable.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,315 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var _keysym = require("./keysym.js");
 | 
			
		||||
 | 
			
		||||
var _keysym2 = _interopRequireDefault(_keysym);
 | 
			
		||||
 | 
			
		||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mapping between HTML key values and VNC/X11 keysyms for "special"
 | 
			
		||||
 * keys that cannot be handled via their Unicode codepoint.
 | 
			
		||||
 *
 | 
			
		||||
 * See https://www.w3.org/TR/uievents-key/ for possible values.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
var DOMKeyTable = {}; /*
 | 
			
		||||
                       * noVNC: HTML5 VNC client
 | 
			
		||||
                       * Copyright (C) 2017 Pierre Ossman for Cendio AB
 | 
			
		||||
                       * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
 | 
			
		||||
                       */
 | 
			
		||||
 | 
			
		||||
function addStandard(key, standard) {
 | 
			
		||||
    if (standard === undefined) throw "Undefined keysym for key \"" + key + "\"";
 | 
			
		||||
    if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\"";
 | 
			
		||||
    DOMKeyTable[key] = [standard, standard, standard, standard];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function addLeftRight(key, left, right) {
 | 
			
		||||
    if (left === undefined) throw "Undefined keysym for key \"" + key + "\"";
 | 
			
		||||
    if (right === undefined) throw "Undefined keysym for key \"" + key + "\"";
 | 
			
		||||
    if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\"";
 | 
			
		||||
    DOMKeyTable[key] = [left, left, right, left];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function addNumpad(key, standard, numpad) {
 | 
			
		||||
    if (standard === undefined) throw "Undefined keysym for key \"" + key + "\"";
 | 
			
		||||
    if (numpad === undefined) throw "Undefined keysym for key \"" + key + "\"";
 | 
			
		||||
    if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\"";
 | 
			
		||||
    DOMKeyTable[key] = [standard, standard, standard, numpad];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 2.2. Modifier Keys
 | 
			
		||||
 | 
			
		||||
addLeftRight("Alt", _keysym2.default.XK_Alt_L, _keysym2.default.XK_Alt_R);
 | 
			
		||||
addStandard("AltGraph", _keysym2.default.XK_ISO_Level3_Shift);
 | 
			
		||||
addStandard("CapsLock", _keysym2.default.XK_Caps_Lock);
 | 
			
		||||
addLeftRight("Control", _keysym2.default.XK_Control_L, _keysym2.default.XK_Control_R);
 | 
			
		||||
// - Fn
 | 
			
		||||
// - FnLock
 | 
			
		||||
addLeftRight("Hyper", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R);
 | 
			
		||||
addLeftRight("Meta", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R);
 | 
			
		||||
addStandard("NumLock", _keysym2.default.XK_Num_Lock);
 | 
			
		||||
addStandard("ScrollLock", _keysym2.default.XK_Scroll_Lock);
 | 
			
		||||
addLeftRight("Shift", _keysym2.default.XK_Shift_L, _keysym2.default.XK_Shift_R);
 | 
			
		||||
addLeftRight("Super", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R);
 | 
			
		||||
// - Symbol
 | 
			
		||||
// - SymbolLock
 | 
			
		||||
 | 
			
		||||
// 2.3. Whitespace Keys
 | 
			
		||||
 | 
			
		||||
addNumpad("Enter", _keysym2.default.XK_Return, _keysym2.default.XK_KP_Enter);
 | 
			
		||||
addStandard("Tab", _keysym2.default.XK_Tab);
 | 
			
		||||
addNumpad(" ", _keysym2.default.XK_space, _keysym2.default.XK_KP_Space);
 | 
			
		||||
 | 
			
		||||
// 2.4. Navigation Keys
 | 
			
		||||
 | 
			
		||||
addNumpad("ArrowDown", _keysym2.default.XK_Down, _keysym2.default.XK_KP_Down);
 | 
			
		||||
addNumpad("ArrowUp", _keysym2.default.XK_Up, _keysym2.default.XK_KP_Up);
 | 
			
		||||
addNumpad("ArrowLeft", _keysym2.default.XK_Left, _keysym2.default.XK_KP_Left);
 | 
			
		||||
addNumpad("ArrowRight", _keysym2.default.XK_Right, _keysym2.default.XK_KP_Right);
 | 
			
		||||
addNumpad("End", _keysym2.default.XK_End, _keysym2.default.XK_KP_End);
 | 
			
		||||
addNumpad("Home", _keysym2.default.XK_Home, _keysym2.default.XK_KP_Home);
 | 
			
		||||
addNumpad("PageDown", _keysym2.default.XK_Next, _keysym2.default.XK_KP_Next);
 | 
			
		||||
addNumpad("PageUp", _keysym2.default.XK_Prior, _keysym2.default.XK_KP_Prior);
 | 
			
		||||
 | 
			
		||||
// 2.5. Editing Keys
 | 
			
		||||
 | 
			
		||||
addStandard("Backspace", _keysym2.default.XK_BackSpace);
 | 
			
		||||
addStandard("Clear", _keysym2.default.XK_Clear);
 | 
			
		||||
addStandard("Copy", _keysym2.default.XF86XK_Copy);
 | 
			
		||||
// - CrSel
 | 
			
		||||
addStandard("Cut", _keysym2.default.XF86XK_Cut);
 | 
			
		||||
addNumpad("Delete", _keysym2.default.XK_Delete, _keysym2.default.XK_KP_Delete);
 | 
			
		||||
// - EraseEof
 | 
			
		||||
// - ExSel
 | 
			
		||||
addNumpad("Insert", _keysym2.default.XK_Insert, _keysym2.default.XK_KP_Insert);
 | 
			
		||||
addStandard("Paste", _keysym2.default.XF86XK_Paste);
 | 
			
		||||
addStandard("Redo", _keysym2.default.XK_Redo);
 | 
			
		||||
addStandard("Undo", _keysym2.default.XK_Undo);
 | 
			
		||||
 | 
			
		||||
// 2.6. UI Keys
 | 
			
		||||
 | 
			
		||||
// - Accept
 | 
			
		||||
// - Again (could just be XK_Redo)
 | 
			
		||||
// - Attn
 | 
			
		||||
addStandard("Cancel", _keysym2.default.XK_Cancel);
 | 
			
		||||
addStandard("ContextMenu", _keysym2.default.XK_Menu);
 | 
			
		||||
addStandard("Escape", _keysym2.default.XK_Escape);
 | 
			
		||||
addStandard("Execute", _keysym2.default.XK_Execute);
 | 
			
		||||
addStandard("Find", _keysym2.default.XK_Find);
 | 
			
		||||
addStandard("Help", _keysym2.default.XK_Help);
 | 
			
		||||
addStandard("Pause", _keysym2.default.XK_Pause);
 | 
			
		||||
// - Play
 | 
			
		||||
// - Props
 | 
			
		||||
addStandard("Select", _keysym2.default.XK_Select);
 | 
			
		||||
addStandard("ZoomIn", _keysym2.default.XF86XK_ZoomIn);
 | 
			
		||||
addStandard("ZoomOut", _keysym2.default.XF86XK_ZoomOut);
 | 
			
		||||
 | 
			
		||||
// 2.7. Device Keys
 | 
			
		||||
 | 
			
		||||
addStandard("BrightnessDown", _keysym2.default.XF86XK_MonBrightnessDown);
 | 
			
		||||
addStandard("BrightnessUp", _keysym2.default.XF86XK_MonBrightnessUp);
 | 
			
		||||
addStandard("Eject", _keysym2.default.XF86XK_Eject);
 | 
			
		||||
addStandard("LogOff", _keysym2.default.XF86XK_LogOff);
 | 
			
		||||
addStandard("Power", _keysym2.default.XF86XK_PowerOff);
 | 
			
		||||
addStandard("PowerOff", _keysym2.default.XF86XK_PowerDown);
 | 
			
		||||
addStandard("PrintScreen", _keysym2.default.XK_Print);
 | 
			
		||||
addStandard("Hibernate", _keysym2.default.XF86XK_Hibernate);
 | 
			
		||||
addStandard("Standby", _keysym2.default.XF86XK_Standby);
 | 
			
		||||
addStandard("WakeUp", _keysym2.default.XF86XK_WakeUp);
 | 
			
		||||
 | 
			
		||||
// 2.8. IME and Composition Keys
 | 
			
		||||
 | 
			
		||||
addStandard("AllCandidates", _keysym2.default.XK_MultipleCandidate);
 | 
			
		||||
addStandard("Alphanumeric", _keysym2.default.XK_Eisu_Shift); // could also be _Eisu_Toggle
 | 
			
		||||
addStandard("CodeInput", _keysym2.default.XK_Codeinput);
 | 
			
		||||
addStandard("Compose", _keysym2.default.XK_Multi_key);
 | 
			
		||||
addStandard("Convert", _keysym2.default.XK_Henkan);
 | 
			
		||||
// - Dead
 | 
			
		||||
// - FinalMode
 | 
			
		||||
addStandard("GroupFirst", _keysym2.default.XK_ISO_First_Group);
 | 
			
		||||
addStandard("GroupLast", _keysym2.default.XK_ISO_Last_Group);
 | 
			
		||||
addStandard("GroupNext", _keysym2.default.XK_ISO_Next_Group);
 | 
			
		||||
addStandard("GroupPrevious", _keysym2.default.XK_ISO_Prev_Group);
 | 
			
		||||
// - ModeChange (XK_Mode_switch is often used for AltGr)
 | 
			
		||||
// - NextCandidate
 | 
			
		||||
addStandard("NonConvert", _keysym2.default.XK_Muhenkan);
 | 
			
		||||
addStandard("PreviousCandidate", _keysym2.default.XK_PreviousCandidate);
 | 
			
		||||
// - Process
 | 
			
		||||
addStandard("SingleCandidate", _keysym2.default.XK_SingleCandidate);
 | 
			
		||||
addStandard("HangulMode", _keysym2.default.XK_Hangul);
 | 
			
		||||
addStandard("HanjaMode", _keysym2.default.XK_Hangul_Hanja);
 | 
			
		||||
addStandard("JunjuaMode", _keysym2.default.XK_Hangul_Jeonja);
 | 
			
		||||
addStandard("Eisu", _keysym2.default.XK_Eisu_toggle);
 | 
			
		||||
addStandard("Hankaku", _keysym2.default.XK_Hankaku);
 | 
			
		||||
addStandard("Hiragana", _keysym2.default.XK_Hiragana);
 | 
			
		||||
addStandard("HiraganaKatakana", _keysym2.default.XK_Hiragana_Katakana);
 | 
			
		||||
addStandard("KanaMode", _keysym2.default.XK_Kana_Shift); // could also be _Kana_Lock
 | 
			
		||||
addStandard("KanjiMode", _keysym2.default.XK_Kanji);
 | 
			
		||||
addStandard("Katakana", _keysym2.default.XK_Katakana);
 | 
			
		||||
addStandard("Romaji", _keysym2.default.XK_Romaji);
 | 
			
		||||
addStandard("Zenkaku", _keysym2.default.XK_Zenkaku);
 | 
			
		||||
addStandard("ZenkakuHanaku", _keysym2.default.XK_Zenkaku_Hankaku);
 | 
			
		||||
 | 
			
		||||
// 2.9. General-Purpose Function Keys
 | 
			
		||||
 | 
			
		||||
addStandard("F1", _keysym2.default.XK_F1);
 | 
			
		||||
addStandard("F2", _keysym2.default.XK_F2);
 | 
			
		||||
addStandard("F3", _keysym2.default.XK_F3);
 | 
			
		||||
addStandard("F4", _keysym2.default.XK_F4);
 | 
			
		||||
addStandard("F5", _keysym2.default.XK_F5);
 | 
			
		||||
addStandard("F6", _keysym2.default.XK_F6);
 | 
			
		||||
addStandard("F7", _keysym2.default.XK_F7);
 | 
			
		||||
addStandard("F8", _keysym2.default.XK_F8);
 | 
			
		||||
addStandard("F9", _keysym2.default.XK_F9);
 | 
			
		||||
addStandard("F10", _keysym2.default.XK_F10);
 | 
			
		||||
addStandard("F11", _keysym2.default.XK_F11);
 | 
			
		||||
addStandard("F12", _keysym2.default.XK_F12);
 | 
			
		||||
addStandard("F13", _keysym2.default.XK_F13);
 | 
			
		||||
addStandard("F14", _keysym2.default.XK_F14);
 | 
			
		||||
addStandard("F15", _keysym2.default.XK_F15);
 | 
			
		||||
addStandard("F16", _keysym2.default.XK_F16);
 | 
			
		||||
addStandard("F17", _keysym2.default.XK_F17);
 | 
			
		||||
addStandard("F18", _keysym2.default.XK_F18);
 | 
			
		||||
addStandard("F19", _keysym2.default.XK_F19);
 | 
			
		||||
addStandard("F20", _keysym2.default.XK_F20);
 | 
			
		||||
addStandard("F21", _keysym2.default.XK_F21);
 | 
			
		||||
addStandard("F22", _keysym2.default.XK_F22);
 | 
			
		||||
addStandard("F23", _keysym2.default.XK_F23);
 | 
			
		||||
addStandard("F24", _keysym2.default.XK_F24);
 | 
			
		||||
addStandard("F25", _keysym2.default.XK_F25);
 | 
			
		||||
addStandard("F26", _keysym2.default.XK_F26);
 | 
			
		||||
addStandard("F27", _keysym2.default.XK_F27);
 | 
			
		||||
addStandard("F28", _keysym2.default.XK_F28);
 | 
			
		||||
addStandard("F29", _keysym2.default.XK_F29);
 | 
			
		||||
addStandard("F30", _keysym2.default.XK_F30);
 | 
			
		||||
addStandard("F31", _keysym2.default.XK_F31);
 | 
			
		||||
addStandard("F32", _keysym2.default.XK_F32);
 | 
			
		||||
addStandard("F33", _keysym2.default.XK_F33);
 | 
			
		||||
addStandard("F34", _keysym2.default.XK_F34);
 | 
			
		||||
addStandard("F35", _keysym2.default.XK_F35);
 | 
			
		||||
// - Soft1...
 | 
			
		||||
 | 
			
		||||
// 2.10. Multimedia Keys
 | 
			
		||||
 | 
			
		||||
// - ChannelDown
 | 
			
		||||
// - ChannelUp
 | 
			
		||||
addStandard("Close", _keysym2.default.XF86XK_Close);
 | 
			
		||||
addStandard("MailForward", _keysym2.default.XF86XK_MailForward);
 | 
			
		||||
addStandard("MailReply", _keysym2.default.XF86XK_Reply);
 | 
			
		||||
addStandard("MainSend", _keysym2.default.XF86XK_Send);
 | 
			
		||||
addStandard("MediaFastForward", _keysym2.default.XF86XK_AudioForward);
 | 
			
		||||
addStandard("MediaPause", _keysym2.default.XF86XK_AudioPause);
 | 
			
		||||
addStandard("MediaPlay", _keysym2.default.XF86XK_AudioPlay);
 | 
			
		||||
addStandard("MediaRecord", _keysym2.default.XF86XK_AudioRecord);
 | 
			
		||||
addStandard("MediaRewind", _keysym2.default.XF86XK_AudioRewind);
 | 
			
		||||
addStandard("MediaStop", _keysym2.default.XF86XK_AudioStop);
 | 
			
		||||
addStandard("MediaTrackNext", _keysym2.default.XF86XK_AudioNext);
 | 
			
		||||
addStandard("MediaTrackPrevious", _keysym2.default.XF86XK_AudioPrev);
 | 
			
		||||
addStandard("New", _keysym2.default.XF86XK_New);
 | 
			
		||||
addStandard("Open", _keysym2.default.XF86XK_Open);
 | 
			
		||||
addStandard("Print", _keysym2.default.XK_Print);
 | 
			
		||||
addStandard("Save", _keysym2.default.XF86XK_Save);
 | 
			
		||||
addStandard("SpellCheck", _keysym2.default.XF86XK_Spell);
 | 
			
		||||
 | 
			
		||||
// 2.11. Multimedia Numpad Keys
 | 
			
		||||
 | 
			
		||||
// - Key11
 | 
			
		||||
// - Key12
 | 
			
		||||
 | 
			
		||||
// 2.12. Audio Keys
 | 
			
		||||
 | 
			
		||||
// - AudioBalanceLeft
 | 
			
		||||
// - AudioBalanceRight
 | 
			
		||||
// - AudioBassDown
 | 
			
		||||
// - AudioBassBoostDown
 | 
			
		||||
// - AudioBassBoostToggle
 | 
			
		||||
// - AudioBassBoostUp
 | 
			
		||||
// - AudioBassUp
 | 
			
		||||
// - AudioFaderFront
 | 
			
		||||
// - AudioFaderRear
 | 
			
		||||
// - AudioSurroundModeNext
 | 
			
		||||
// - AudioTrebleDown
 | 
			
		||||
// - AudioTrebleUp
 | 
			
		||||
addStandard("AudioVolumeDown", _keysym2.default.XF86XK_AudioLowerVolume);
 | 
			
		||||
addStandard("AudioVolumeUp", _keysym2.default.XF86XK_AudioRaiseVolume);
 | 
			
		||||
addStandard("AudioVolumeMute", _keysym2.default.XF86XK_AudioMute);
 | 
			
		||||
// - MicrophoneToggle
 | 
			
		||||
// - MicrophoneVolumeDown
 | 
			
		||||
// - MicrophoneVolumeUp
 | 
			
		||||
addStandard("MicrophoneVolumeMute", _keysym2.default.XF86XK_AudioMicMute);
 | 
			
		||||
 | 
			
		||||
// 2.13. Speech Keys
 | 
			
		||||
 | 
			
		||||
// - SpeechCorrectionList
 | 
			
		||||
// - SpeechInputToggle
 | 
			
		||||
 | 
			
		||||
// 2.14. Application Keys
 | 
			
		||||
 | 
			
		||||
addStandard("LaunchCalculator", _keysym2.default.XF86XK_Calculator);
 | 
			
		||||
addStandard("LaunchCalendar", _keysym2.default.XF86XK_Calendar);
 | 
			
		||||
addStandard("LaunchMail", _keysym2.default.XF86XK_Mail);
 | 
			
		||||
addStandard("LaunchMediaPlayer", _keysym2.default.XF86XK_AudioMedia);
 | 
			
		||||
addStandard("LaunchMusicPlayer", _keysym2.default.XF86XK_Music);
 | 
			
		||||
addStandard("LaunchMyComputer", _keysym2.default.XF86XK_MyComputer);
 | 
			
		||||
addStandard("LaunchPhone", _keysym2.default.XF86XK_Phone);
 | 
			
		||||
addStandard("LaunchScreenSaver", _keysym2.default.XF86XK_ScreenSaver);
 | 
			
		||||
addStandard("LaunchSpreadsheet", _keysym2.default.XF86XK_Excel);
 | 
			
		||||
addStandard("LaunchWebBrowser", _keysym2.default.XF86XK_WWW);
 | 
			
		||||
addStandard("LaunchWebCam", _keysym2.default.XF86XK_WebCam);
 | 
			
		||||
addStandard("LaunchWordProcessor", _keysym2.default.XF86XK_Word);
 | 
			
		||||
 | 
			
		||||
// 2.15. Browser Keys
 | 
			
		||||
 | 
			
		||||
addStandard("BrowserBack", _keysym2.default.XF86XK_Back);
 | 
			
		||||
addStandard("BrowserFavorites", _keysym2.default.XF86XK_Favorites);
 | 
			
		||||
addStandard("BrowserForward", _keysym2.default.XF86XK_Forward);
 | 
			
		||||
addStandard("BrowserHome", _keysym2.default.XF86XK_HomePage);
 | 
			
		||||
addStandard("BrowserRefresh", _keysym2.default.XF86XK_Refresh);
 | 
			
		||||
addStandard("BrowserSearch", _keysym2.default.XF86XK_Search);
 | 
			
		||||
addStandard("BrowserStop", _keysym2.default.XF86XK_Stop);
 | 
			
		||||
 | 
			
		||||
// 2.16. Mobile Phone Keys
 | 
			
		||||
 | 
			
		||||
// - A whole bunch...
 | 
			
		||||
 | 
			
		||||
// 2.17. TV Keys
 | 
			
		||||
 | 
			
		||||
// - A whole bunch...
 | 
			
		||||
 | 
			
		||||
// 2.18. Media Controller Keys
 | 
			
		||||
 | 
			
		||||
// - A whole bunch...
 | 
			
		||||
addStandard("Dimmer", _keysym2.default.XF86XK_BrightnessAdjust);
 | 
			
		||||
addStandard("MediaAudioTrack", _keysym2.default.XF86XK_AudioCycleTrack);
 | 
			
		||||
addStandard("RandomToggle", _keysym2.default.XF86XK_AudioRandomPlay);
 | 
			
		||||
addStandard("SplitScreenToggle", _keysym2.default.XF86XK_SplitScreen);
 | 
			
		||||
addStandard("Subtitle", _keysym2.default.XF86XK_Subtitle);
 | 
			
		||||
addStandard("VideoModeNext", _keysym2.default.XF86XK_Next_VMode);
 | 
			
		||||
 | 
			
		||||
// Extra: Numpad
 | 
			
		||||
 | 
			
		||||
addNumpad("=", _keysym2.default.XK_equal, _keysym2.default.XK_KP_Equal);
 | 
			
		||||
addNumpad("+", _keysym2.default.XK_plus, _keysym2.default.XK_KP_Add);
 | 
			
		||||
addNumpad("-", _keysym2.default.XK_minus, _keysym2.default.XK_KP_Subtract);
 | 
			
		||||
addNumpad("*", _keysym2.default.XK_asterisk, _keysym2.default.XK_KP_Multiply);
 | 
			
		||||
addNumpad("/", _keysym2.default.XK_slash, _keysym2.default.XK_KP_Divide);
 | 
			
		||||
addNumpad(".", _keysym2.default.XK_period, _keysym2.default.XK_KP_Decimal);
 | 
			
		||||
addNumpad(",", _keysym2.default.XK_comma, _keysym2.default.XK_KP_Separator);
 | 
			
		||||
addNumpad("0", _keysym2.default.XK_0, _keysym2.default.XK_KP_0);
 | 
			
		||||
addNumpad("1", _keysym2.default.XK_1, _keysym2.default.XK_KP_1);
 | 
			
		||||
addNumpad("2", _keysym2.default.XK_2, _keysym2.default.XK_KP_2);
 | 
			
		||||
addNumpad("3", _keysym2.default.XK_3, _keysym2.default.XK_KP_3);
 | 
			
		||||
addNumpad("4", _keysym2.default.XK_4, _keysym2.default.XK_KP_4);
 | 
			
		||||
addNumpad("5", _keysym2.default.XK_5, _keysym2.default.XK_KP_5);
 | 
			
		||||
addNumpad("6", _keysym2.default.XK_6, _keysym2.default.XK_KP_6);
 | 
			
		||||
addNumpad("7", _keysym2.default.XK_7, _keysym2.default.XK_KP_7);
 | 
			
		||||
addNumpad("8", _keysym2.default.XK_8, _keysym2.default.XK_KP_8);
 | 
			
		||||
addNumpad("9", _keysym2.default.XK_9, _keysym2.default.XK_KP_9);
 | 
			
		||||
 | 
			
		||||
exports.default = DOMKeyTable;
 | 
			
		||||
							
								
								
									
										132
									
								
								static/js/novnc/core/input/fixedkeys.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,132 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
/*
 | 
			
		||||
 * noVNC: HTML5 VNC client
 | 
			
		||||
 * Copyright (C) 2017 Pierre Ossman for Cendio AB
 | 
			
		||||
 * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Fallback mapping between HTML key codes (physical keys) and
 | 
			
		||||
 * HTML key values. This only works for keys that don't vary
 | 
			
		||||
 * between layouts. We also omit those who manage fine by mapping the
 | 
			
		||||
 * Unicode representation.
 | 
			
		||||
 *
 | 
			
		||||
 * See https://www.w3.org/TR/uievents-code/ for possible codes.
 | 
			
		||||
 * See https://www.w3.org/TR/uievents-key/ for possible values.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
exports.default = {
 | 
			
		||||
 | 
			
		||||
    // 3.1.1.1. Writing System Keys
 | 
			
		||||
 | 
			
		||||
    'Backspace': 'Backspace',
 | 
			
		||||
 | 
			
		||||
    // 3.1.1.2. Functional Keys
 | 
			
		||||
 | 
			
		||||
    'AltLeft': 'Alt',
 | 
			
		||||
    'AltRight': 'Alt', // This could also be 'AltGraph'
 | 
			
		||||
    'CapsLock': 'CapsLock',
 | 
			
		||||
    'ContextMenu': 'ContextMenu',
 | 
			
		||||
    'ControlLeft': 'Control',
 | 
			
		||||
    'ControlRight': 'Control',
 | 
			
		||||
    'Enter': 'Enter',
 | 
			
		||||
    'MetaLeft': 'Meta',
 | 
			
		||||
    'MetaRight': 'Meta',
 | 
			
		||||
    'ShiftLeft': 'Shift',
 | 
			
		||||
    'ShiftRight': 'Shift',
 | 
			
		||||
    'Tab': 'Tab',
 | 
			
		||||
    // FIXME: Japanese/Korean keys
 | 
			
		||||
 | 
			
		||||
    // 3.1.2. Control Pad Section
 | 
			
		||||
 | 
			
		||||
    'Delete': 'Delete',
 | 
			
		||||
    'End': 'End',
 | 
			
		||||
    'Help': 'Help',
 | 
			
		||||
    'Home': 'Home',
 | 
			
		||||
    'Insert': 'Insert',
 | 
			
		||||
    'PageDown': 'PageDown',
 | 
			
		||||
    'PageUp': 'PageUp',
 | 
			
		||||
 | 
			
		||||
    // 3.1.3. Arrow Pad Section
 | 
			
		||||
 | 
			
		||||
    'ArrowDown': 'ArrowDown',
 | 
			
		||||
    'ArrowLeft': 'ArrowLeft',
 | 
			
		||||
    'ArrowRight': 'ArrowRight',
 | 
			
		||||
    'ArrowUp': 'ArrowUp',
 | 
			
		||||
 | 
			
		||||
    // 3.1.4. Numpad Section
 | 
			
		||||
 | 
			
		||||
    'NumLock': 'NumLock',
 | 
			
		||||
    'NumpadBackspace': 'Backspace',
 | 
			
		||||
    'NumpadClear': 'Clear',
 | 
			
		||||
 | 
			
		||||
    // 3.1.5. Function Section
 | 
			
		||||
 | 
			
		||||
    'Escape': 'Escape',
 | 
			
		||||
    'F1': 'F1',
 | 
			
		||||
    'F2': 'F2',
 | 
			
		||||
    'F3': 'F3',
 | 
			
		||||
    'F4': 'F4',
 | 
			
		||||
    'F5': 'F5',
 | 
			
		||||
    'F6': 'F6',
 | 
			
		||||
    'F7': 'F7',
 | 
			
		||||
    'F8': 'F8',
 | 
			
		||||
    'F9': 'F9',
 | 
			
		||||
    'F10': 'F10',
 | 
			
		||||
    'F11': 'F11',
 | 
			
		||||
    'F12': 'F12',
 | 
			
		||||
    'F13': 'F13',
 | 
			
		||||
    'F14': 'F14',
 | 
			
		||||
    'F15': 'F15',
 | 
			
		||||
    'F16': 'F16',
 | 
			
		||||
    'F17': 'F17',
 | 
			
		||||
    'F18': 'F18',
 | 
			
		||||
    'F19': 'F19',
 | 
			
		||||
    'F20': 'F20',
 | 
			
		||||
    'F21': 'F21',
 | 
			
		||||
    'F22': 'F22',
 | 
			
		||||
    'F23': 'F23',
 | 
			
		||||
    'F24': 'F24',
 | 
			
		||||
    'F25': 'F25',
 | 
			
		||||
    'F26': 'F26',
 | 
			
		||||
    'F27': 'F27',
 | 
			
		||||
    'F28': 'F28',
 | 
			
		||||
    'F29': 'F29',
 | 
			
		||||
    'F30': 'F30',
 | 
			
		||||
    'F31': 'F31',
 | 
			
		||||
    'F32': 'F32',
 | 
			
		||||
    'F33': 'F33',
 | 
			
		||||
    'F34': 'F34',
 | 
			
		||||
    'F35': 'F35',
 | 
			
		||||
    'PrintScreen': 'PrintScreen',
 | 
			
		||||
    'ScrollLock': 'ScrollLock',
 | 
			
		||||
    'Pause': 'Pause',
 | 
			
		||||
 | 
			
		||||
    // 3.1.6. Media Keys
 | 
			
		||||
 | 
			
		||||
    'BrowserBack': 'BrowserBack',
 | 
			
		||||
    'BrowserFavorites': 'BrowserFavorites',
 | 
			
		||||
    'BrowserForward': 'BrowserForward',
 | 
			
		||||
    'BrowserHome': 'BrowserHome',
 | 
			
		||||
    'BrowserRefresh': 'BrowserRefresh',
 | 
			
		||||
    'BrowserSearch': 'BrowserSearch',
 | 
			
		||||
    'BrowserStop': 'BrowserStop',
 | 
			
		||||
    'Eject': 'Eject',
 | 
			
		||||
    'LaunchApp1': 'LaunchMyComputer',
 | 
			
		||||
    'LaunchApp2': 'LaunchCalendar',
 | 
			
		||||
    'LaunchMail': 'LaunchMail',
 | 
			
		||||
    'MediaPlayPause': 'MediaPlay',
 | 
			
		||||
    'MediaStop': 'MediaStop',
 | 
			
		||||
    'MediaTrackNext': 'MediaTrackNext',
 | 
			
		||||
    'MediaTrackPrevious': 'MediaTrackPrevious',
 | 
			
		||||
    'Power': 'Power',
 | 
			
		||||
    'Sleep': 'Sleep',
 | 
			
		||||
    'AudioVolumeDown': 'AudioVolumeDown',
 | 
			
		||||
    'AudioVolumeMute': 'AudioVolumeMute',
 | 
			
		||||
    'AudioVolumeUp': 'AudioVolumeUp',
 | 
			
		||||
    'WakeUp': 'WakeUp'
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										326
									
								
								static/js/novnc/core/input/keyboard.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,326 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.default = Keyboard;
 | 
			
		||||
 | 
			
		||||
var _logging = require('../util/logging.js');
 | 
			
		||||
 | 
			
		||||
var Log = _interopRequireWildcard(_logging);
 | 
			
		||||
 | 
			
		||||
var _events = require('../util/events.js');
 | 
			
		||||
 | 
			
		||||
var _util = require('./util.js');
 | 
			
		||||
 | 
			
		||||
var KeyboardUtil = _interopRequireWildcard(_util);
 | 
			
		||||
 | 
			
		||||
var _keysym = require('./keysym.js');
 | 
			
		||||
 | 
			
		||||
var _keysym2 = _interopRequireDefault(_keysym);
 | 
			
		||||
 | 
			
		||||
var _browser = require('../util/browser.js');
 | 
			
		||||
 | 
			
		||||
var browser = _interopRequireWildcard(_browser);
 | 
			
		||||
 | 
			
		||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
			
		||||
 | 
			
		||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Keyboard event handler
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
function Keyboard(target) {
 | 
			
		||||
    this._target = target || null;
 | 
			
		||||
 | 
			
		||||
    this._keyDownList = {}; // List of depressed keys
 | 
			
		||||
    // (even if they are happy)
 | 
			
		||||
    this._pendingKey = null; // Key waiting for keypress
 | 
			
		||||
 | 
			
		||||
    // keep these here so we can refer to them later
 | 
			
		||||
    this._eventHandlers = {
 | 
			
		||||
        'keyup': this._handleKeyUp.bind(this),
 | 
			
		||||
        'keydown': this._handleKeyDown.bind(this),
 | 
			
		||||
        'keypress': this._handleKeyPress.bind(this),
 | 
			
		||||
        'blur': this._allKeysUp.bind(this)
 | 
			
		||||
    };
 | 
			
		||||
} /*
 | 
			
		||||
   * 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)
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
Keyboard.prototype = {
 | 
			
		||||
    // ===== EVENT HANDLERS =====
 | 
			
		||||
 | 
			
		||||
    onkeyevent: function () {}, // Handler for key press/release
 | 
			
		||||
 | 
			
		||||
    // ===== PRIVATE METHODS =====
 | 
			
		||||
 | 
			
		||||
    _sendKeyEvent: function (keysym, code, down) {
 | 
			
		||||
        Log.Debug("onkeyevent " + (down ? "down" : "up") + ", keysym: " + keysym, ", code: " + code);
 | 
			
		||||
 | 
			
		||||
        // Windows sends CtrlLeft+AltRight when you press
 | 
			
		||||
        // AltGraph, which tends to confuse the hell out of
 | 
			
		||||
        // remote systems. Fake a release of these keys until
 | 
			
		||||
        // there is a way to detect AltGraph properly.
 | 
			
		||||
        var fakeAltGraph = false;
 | 
			
		||||
        if (down && browser.isWindows()) {
 | 
			
		||||
            if (code !== 'ControlLeft' && code !== 'AltRight' && 'ControlLeft' in this._keyDownList && 'AltRight' in this._keyDownList) {
 | 
			
		||||
                fakeAltGraph = true;
 | 
			
		||||
                this.onkeyevent(this._keyDownList['AltRight'], 'AltRight', false);
 | 
			
		||||
                this.onkeyevent(this._keyDownList['ControlLeft'], 'ControlLeft', false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.onkeyevent(keysym, code, down);
 | 
			
		||||
 | 
			
		||||
        if (fakeAltGraph) {
 | 
			
		||||
            this.onkeyevent(this._keyDownList['ControlLeft'], 'ControlLeft', true);
 | 
			
		||||
            this.onkeyevent(this._keyDownList['AltRight'], 'AltRight', true);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getKeyCode: function (e) {
 | 
			
		||||
        var code = KeyboardUtil.getKeycode(e);
 | 
			
		||||
        if (code !== 'Unidentified') {
 | 
			
		||||
            return code;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Unstable, but we don't have anything else to go on
 | 
			
		||||
        // (don't use it for 'keypress' events thought since
 | 
			
		||||
        // WebKit sets it to the same as charCode)
 | 
			
		||||
        if (e.keyCode && e.type !== 'keypress') {
 | 
			
		||||
            // 229 is used for composition events
 | 
			
		||||
            if (e.keyCode !== 229) {
 | 
			
		||||
                return 'Platform' + e.keyCode;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // A precursor to the final DOM3 standard. Unfortunately it
 | 
			
		||||
        // is not layout independent, so it is as bad as using keyCode
 | 
			
		||||
        if (e.keyIdentifier) {
 | 
			
		||||
            // Non-character key?
 | 
			
		||||
            if (e.keyIdentifier.substr(0, 2) !== 'U+') {
 | 
			
		||||
                return e.keyIdentifier;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var codepoint = parseInt(e.keyIdentifier.substr(2), 16);
 | 
			
		||||
            var char = String.fromCharCode(codepoint);
 | 
			
		||||
            // Some implementations fail to uppercase the symbols
 | 
			
		||||
            char = char.toUpperCase();
 | 
			
		||||
 | 
			
		||||
            return 'Platform' + char.charCodeAt();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return 'Unidentified';
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleKeyDown: function (e) {
 | 
			
		||||
        var code = this._getKeyCode(e);
 | 
			
		||||
        var keysym = KeyboardUtil.getKeysym(e);
 | 
			
		||||
 | 
			
		||||
        // We cannot handle keys we cannot track, but we also need
 | 
			
		||||
        // to deal with virtual keyboards which omit key info
 | 
			
		||||
        // (iOS omits tracking info on keyup events, which forces us to
 | 
			
		||||
        // special treat that platform here)
 | 
			
		||||
        if (code === 'Unidentified' || browser.isIOS()) {
 | 
			
		||||
            if (keysym) {
 | 
			
		||||
                // If it's a virtual keyboard then it should be
 | 
			
		||||
                // sufficient to just send press and release right
 | 
			
		||||
                // after each other
 | 
			
		||||
                this._sendKeyEvent(keysym, code, true);
 | 
			
		||||
                this._sendKeyEvent(keysym, code, false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            (0, _events.stopEvent)(e);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Alt behaves more like AltGraph on macOS, so shuffle the
 | 
			
		||||
        // keys around a bit to make things more sane for the remote
 | 
			
		||||
        // server. This method is used by RealVNC and TigerVNC (and
 | 
			
		||||
        // possibly others).
 | 
			
		||||
        if (browser.isMac()) {
 | 
			
		||||
            switch (keysym) {
 | 
			
		||||
                case _keysym2.default.XK_Super_L:
 | 
			
		||||
                    keysym = _keysym2.default.XK_Alt_L;
 | 
			
		||||
                    break;
 | 
			
		||||
                case _keysym2.default.XK_Super_R:
 | 
			
		||||
                    keysym = _keysym2.default.XK_Super_L;
 | 
			
		||||
                    break;
 | 
			
		||||
                case _keysym2.default.XK_Alt_L:
 | 
			
		||||
                    keysym = _keysym2.default.XK_Mode_switch;
 | 
			
		||||
                    break;
 | 
			
		||||
                case _keysym2.default.XK_Alt_R:
 | 
			
		||||
                    keysym = _keysym2.default.XK_ISO_Level3_Shift;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Is this key already pressed? If so, then we must use the
 | 
			
		||||
        // same keysym or we'll confuse the server
 | 
			
		||||
        if (code in this._keyDownList) {
 | 
			
		||||
            keysym = this._keyDownList[code];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // macOS doesn't send proper key events for modifiers, only
 | 
			
		||||
        // state change events. That gets extra confusing for CapsLock
 | 
			
		||||
        // which toggles on each press, but not on release. So pretend
 | 
			
		||||
        // it was a quick press and release of the button.
 | 
			
		||||
        if (browser.isMac() && code === 'CapsLock') {
 | 
			
		||||
            this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', true);
 | 
			
		||||
            this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', false);
 | 
			
		||||
            (0, _events.stopEvent)(e);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If this is a legacy browser then we'll need to wait for
 | 
			
		||||
        // a keypress event as well
 | 
			
		||||
        // (IE and Edge has a broken KeyboardEvent.key, so we can't
 | 
			
		||||
        // just check for the presence of that field)
 | 
			
		||||
        if (!keysym && (!e.key || browser.isIE() || browser.isEdge())) {
 | 
			
		||||
            this._pendingKey = code;
 | 
			
		||||
            // However we might not get a keypress event if the key
 | 
			
		||||
            // is non-printable, which needs some special fallback
 | 
			
		||||
            // handling
 | 
			
		||||
            setTimeout(this._handleKeyPressTimeout.bind(this), 10, e);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pendingKey = null;
 | 
			
		||||
        (0, _events.stopEvent)(e);
 | 
			
		||||
 | 
			
		||||
        this._keyDownList[code] = keysym;
 | 
			
		||||
 | 
			
		||||
        this._sendKeyEvent(keysym, code, true);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Legacy event for browsers without code/key
 | 
			
		||||
    _handleKeyPress: function (e) {
 | 
			
		||||
        (0, _events.stopEvent)(e);
 | 
			
		||||
 | 
			
		||||
        // Are we expecting a keypress?
 | 
			
		||||
        if (this._pendingKey === null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var code = this._getKeyCode(e);
 | 
			
		||||
        var keysym = KeyboardUtil.getKeysym(e);
 | 
			
		||||
 | 
			
		||||
        // The key we were waiting for?
 | 
			
		||||
        if (code !== 'Unidentified' && code != this._pendingKey) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        code = this._pendingKey;
 | 
			
		||||
        this._pendingKey = null;
 | 
			
		||||
 | 
			
		||||
        if (!keysym) {
 | 
			
		||||
            Log.Info('keypress with no keysym:', e);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._keyDownList[code] = keysym;
 | 
			
		||||
 | 
			
		||||
        this._sendKeyEvent(keysym, code, true);
 | 
			
		||||
    },
 | 
			
		||||
    _handleKeyPressTimeout: function (e) {
 | 
			
		||||
        // Did someone manage to sort out the key already?
 | 
			
		||||
        if (this._pendingKey === null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var code, keysym;
 | 
			
		||||
 | 
			
		||||
        code = this._pendingKey;
 | 
			
		||||
        this._pendingKey = null;
 | 
			
		||||
 | 
			
		||||
        // We have no way of knowing the proper keysym with the
 | 
			
		||||
        // information given, but the following are true for most
 | 
			
		||||
        // layouts
 | 
			
		||||
        if (e.keyCode >= 0x30 && e.keyCode <= 0x39) {
 | 
			
		||||
            // Digit
 | 
			
		||||
            keysym = e.keyCode;
 | 
			
		||||
        } else if (e.keyCode >= 0x41 && e.keyCode <= 0x5a) {
 | 
			
		||||
            // Character (A-Z)
 | 
			
		||||
            var char = String.fromCharCode(e.keyCode);
 | 
			
		||||
            // A feeble attempt at the correct case
 | 
			
		||||
            if (e.shiftKey) char = char.toUpperCase();else char = char.toLowerCase();
 | 
			
		||||
            keysym = char.charCodeAt();
 | 
			
		||||
        } else {
 | 
			
		||||
            // Unknown, give up
 | 
			
		||||
            keysym = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._keyDownList[code] = keysym;
 | 
			
		||||
 | 
			
		||||
        this._sendKeyEvent(keysym, code, true);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleKeyUp: function (e) {
 | 
			
		||||
        (0, _events.stopEvent)(e);
 | 
			
		||||
 | 
			
		||||
        var code = this._getKeyCode(e);
 | 
			
		||||
 | 
			
		||||
        // See comment in _handleKeyDown()
 | 
			
		||||
        if (browser.isMac() && code === 'CapsLock') {
 | 
			
		||||
            this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', true);
 | 
			
		||||
            this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', false);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Do we really think this key is down?
 | 
			
		||||
        if (!(code in this._keyDownList)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._sendKeyEvent(this._keyDownList[code], code, false);
 | 
			
		||||
 | 
			
		||||
        delete this._keyDownList[code];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _allKeysUp: function () {
 | 
			
		||||
        Log.Debug(">> Keyboard.allKeysUp");
 | 
			
		||||
        for (var code in this._keyDownList) {
 | 
			
		||||
            this._sendKeyEvent(this._keyDownList[code], code, false);
 | 
			
		||||
        };
 | 
			
		||||
        this._keyDownList = {};
 | 
			
		||||
        Log.Debug("<< Keyboard.allKeysUp");
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // ===== PUBLIC METHODS =====
 | 
			
		||||
 | 
			
		||||
    grab: function () {
 | 
			
		||||
        //Log.Debug(">> Keyboard.grab");
 | 
			
		||||
        var c = this._target;
 | 
			
		||||
 | 
			
		||||
        c.addEventListener('keydown', this._eventHandlers.keydown);
 | 
			
		||||
        c.addEventListener('keyup', this._eventHandlers.keyup);
 | 
			
		||||
        c.addEventListener('keypress', this._eventHandlers.keypress);
 | 
			
		||||
 | 
			
		||||
        // Release (key up) if window loses focus
 | 
			
		||||
        window.addEventListener('blur', this._eventHandlers.blur);
 | 
			
		||||
 | 
			
		||||
        //Log.Debug("<< Keyboard.grab");
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    ungrab: function () {
 | 
			
		||||
        //Log.Debug(">> Keyboard.ungrab");
 | 
			
		||||
        var c = this._target;
 | 
			
		||||
 | 
			
		||||
        c.removeEventListener('keydown', this._eventHandlers.keydown);
 | 
			
		||||
        c.removeEventListener('keyup', this._eventHandlers.keyup);
 | 
			
		||||
        c.removeEventListener('keypress', this._eventHandlers.keypress);
 | 
			
		||||
        window.removeEventListener('blur', this._eventHandlers.blur);
 | 
			
		||||
 | 
			
		||||
        // Release (key up) all keys that are in a down state
 | 
			
		||||
        this._allKeysUp();
 | 
			
		||||
 | 
			
		||||
        //Log.Debug(">> Keyboard.ungrab");
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										618
									
								
								static/js/novnc/core/input/keysym.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,618 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
  value: true
 | 
			
		||||
});
 | 
			
		||||
exports.default = {
 | 
			
		||||
  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 */
 | 
			
		||||
 | 
			
		||||
  /* International & multi-key character composition */
 | 
			
		||||
 | 
			
		||||
  XK_Multi_key: 0xff20, /* Multi-key character compose */
 | 
			
		||||
  XK_Codeinput: 0xff37,
 | 
			
		||||
  XK_SingleCandidate: 0xff3c,
 | 
			
		||||
  XK_MultipleCandidate: 0xff3d,
 | 
			
		||||
  XK_PreviousCandidate: 0xff3e,
 | 
			
		||||
 | 
			
		||||
  /* Japanese keyboard support */
 | 
			
		||||
 | 
			
		||||
  XK_Kanji: 0xff21, /* Kanji, Kanji convert */
 | 
			
		||||
  XK_Muhenkan: 0xff22, /* Cancel Conversion */
 | 
			
		||||
  XK_Henkan_Mode: 0xff23, /* Start/Stop Conversion */
 | 
			
		||||
  XK_Henkan: 0xff23, /* Alias for Henkan_Mode */
 | 
			
		||||
  XK_Romaji: 0xff24, /* to Romaji */
 | 
			
		||||
  XK_Hiragana: 0xff25, /* to Hiragana */
 | 
			
		||||
  XK_Katakana: 0xff26, /* to Katakana */
 | 
			
		||||
  XK_Hiragana_Katakana: 0xff27, /* Hiragana/Katakana toggle */
 | 
			
		||||
  XK_Zenkaku: 0xff28, /* to Zenkaku */
 | 
			
		||||
  XK_Hankaku: 0xff29, /* to Hankaku */
 | 
			
		||||
  XK_Zenkaku_Hankaku: 0xff2a, /* Zenkaku/Hankaku toggle */
 | 
			
		||||
  XK_Touroku: 0xff2b, /* Add to Dictionary */
 | 
			
		||||
  XK_Massyo: 0xff2c, /* Delete from Dictionary */
 | 
			
		||||
  XK_Kana_Lock: 0xff2d, /* Kana Lock */
 | 
			
		||||
  XK_Kana_Shift: 0xff2e, /* Kana Shift */
 | 
			
		||||
  XK_Eisu_Shift: 0xff2f, /* Alphanumeric Shift */
 | 
			
		||||
  XK_Eisu_toggle: 0xff30, /* Alphanumeric toggle */
 | 
			
		||||
  XK_Kanji_Bangou: 0xff37, /* Codeinput */
 | 
			
		||||
  XK_Zen_Koho: 0xff3d, /* Multiple/All Candidate(s) */
 | 
			
		||||
  XK_Mae_Koho: 0xff3e, /* Previous Candidate */
 | 
			
		||||
 | 
			
		||||
  /* 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 */
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Keyboard (XKB) Extension function and modifier keys
 | 
			
		||||
   * (from Appendix C of "The X Keyboard Extension: Protocol Specification")
 | 
			
		||||
   * Byte 3 = 0xfe
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  XK_ISO_Level3_Shift: 0xfe03, /* AltGr */
 | 
			
		||||
  XK_ISO_Next_Group: 0xfe08,
 | 
			
		||||
  XK_ISO_Prev_Group: 0xfe0a,
 | 
			
		||||
  XK_ISO_First_Group: 0xfe0c,
 | 
			
		||||
  XK_ISO_Last_Group: 0xfe0e,
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * 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 */
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Korean
 | 
			
		||||
   * Byte 3 = 0x0e
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  XK_Hangul: 0xff31, /* Hangul start/stop(toggle) */
 | 
			
		||||
  XK_Hangul_Hanja: 0xff34, /* Start Hangul->Hanja Conversion */
 | 
			
		||||
  XK_Hangul_Jeonja: 0xff38, /* Jeonja mode */
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * XFree86 vendor specific keysyms.
 | 
			
		||||
   *
 | 
			
		||||
   * The XFree86 keysym range is 0x10080001 - 0x1008FFFF.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  XF86XK_ModeLock: 0x1008FF01,
 | 
			
		||||
  XF86XK_MonBrightnessUp: 0x1008FF02,
 | 
			
		||||
  XF86XK_MonBrightnessDown: 0x1008FF03,
 | 
			
		||||
  XF86XK_KbdLightOnOff: 0x1008FF04,
 | 
			
		||||
  XF86XK_KbdBrightnessUp: 0x1008FF05,
 | 
			
		||||
  XF86XK_KbdBrightnessDown: 0x1008FF06,
 | 
			
		||||
  XF86XK_Standby: 0x1008FF10,
 | 
			
		||||
  XF86XK_AudioLowerVolume: 0x1008FF11,
 | 
			
		||||
  XF86XK_AudioMute: 0x1008FF12,
 | 
			
		||||
  XF86XK_AudioRaiseVolume: 0x1008FF13,
 | 
			
		||||
  XF86XK_AudioPlay: 0x1008FF14,
 | 
			
		||||
  XF86XK_AudioStop: 0x1008FF15,
 | 
			
		||||
  XF86XK_AudioPrev: 0x1008FF16,
 | 
			
		||||
  XF86XK_AudioNext: 0x1008FF17,
 | 
			
		||||
  XF86XK_HomePage: 0x1008FF18,
 | 
			
		||||
  XF86XK_Mail: 0x1008FF19,
 | 
			
		||||
  XF86XK_Start: 0x1008FF1A,
 | 
			
		||||
  XF86XK_Search: 0x1008FF1B,
 | 
			
		||||
  XF86XK_AudioRecord: 0x1008FF1C,
 | 
			
		||||
  XF86XK_Calculator: 0x1008FF1D,
 | 
			
		||||
  XF86XK_Memo: 0x1008FF1E,
 | 
			
		||||
  XF86XK_ToDoList: 0x1008FF1F,
 | 
			
		||||
  XF86XK_Calendar: 0x1008FF20,
 | 
			
		||||
  XF86XK_PowerDown: 0x1008FF21,
 | 
			
		||||
  XF86XK_ContrastAdjust: 0x1008FF22,
 | 
			
		||||
  XF86XK_RockerUp: 0x1008FF23,
 | 
			
		||||
  XF86XK_RockerDown: 0x1008FF24,
 | 
			
		||||
  XF86XK_RockerEnter: 0x1008FF25,
 | 
			
		||||
  XF86XK_Back: 0x1008FF26,
 | 
			
		||||
  XF86XK_Forward: 0x1008FF27,
 | 
			
		||||
  XF86XK_Stop: 0x1008FF28,
 | 
			
		||||
  XF86XK_Refresh: 0x1008FF29,
 | 
			
		||||
  XF86XK_PowerOff: 0x1008FF2A,
 | 
			
		||||
  XF86XK_WakeUp: 0x1008FF2B,
 | 
			
		||||
  XF86XK_Eject: 0x1008FF2C,
 | 
			
		||||
  XF86XK_ScreenSaver: 0x1008FF2D,
 | 
			
		||||
  XF86XK_WWW: 0x1008FF2E,
 | 
			
		||||
  XF86XK_Sleep: 0x1008FF2F,
 | 
			
		||||
  XF86XK_Favorites: 0x1008FF30,
 | 
			
		||||
  XF86XK_AudioPause: 0x1008FF31,
 | 
			
		||||
  XF86XK_AudioMedia: 0x1008FF32,
 | 
			
		||||
  XF86XK_MyComputer: 0x1008FF33,
 | 
			
		||||
  XF86XK_VendorHome: 0x1008FF34,
 | 
			
		||||
  XF86XK_LightBulb: 0x1008FF35,
 | 
			
		||||
  XF86XK_Shop: 0x1008FF36,
 | 
			
		||||
  XF86XK_History: 0x1008FF37,
 | 
			
		||||
  XF86XK_OpenURL: 0x1008FF38,
 | 
			
		||||
  XF86XK_AddFavorite: 0x1008FF39,
 | 
			
		||||
  XF86XK_HotLinks: 0x1008FF3A,
 | 
			
		||||
  XF86XK_BrightnessAdjust: 0x1008FF3B,
 | 
			
		||||
  XF86XK_Finance: 0x1008FF3C,
 | 
			
		||||
  XF86XK_Community: 0x1008FF3D,
 | 
			
		||||
  XF86XK_AudioRewind: 0x1008FF3E,
 | 
			
		||||
  XF86XK_BackForward: 0x1008FF3F,
 | 
			
		||||
  XF86XK_Launch0: 0x1008FF40,
 | 
			
		||||
  XF86XK_Launch1: 0x1008FF41,
 | 
			
		||||
  XF86XK_Launch2: 0x1008FF42,
 | 
			
		||||
  XF86XK_Launch3: 0x1008FF43,
 | 
			
		||||
  XF86XK_Launch4: 0x1008FF44,
 | 
			
		||||
  XF86XK_Launch5: 0x1008FF45,
 | 
			
		||||
  XF86XK_Launch6: 0x1008FF46,
 | 
			
		||||
  XF86XK_Launch7: 0x1008FF47,
 | 
			
		||||
  XF86XK_Launch8: 0x1008FF48,
 | 
			
		||||
  XF86XK_Launch9: 0x1008FF49,
 | 
			
		||||
  XF86XK_LaunchA: 0x1008FF4A,
 | 
			
		||||
  XF86XK_LaunchB: 0x1008FF4B,
 | 
			
		||||
  XF86XK_LaunchC: 0x1008FF4C,
 | 
			
		||||
  XF86XK_LaunchD: 0x1008FF4D,
 | 
			
		||||
  XF86XK_LaunchE: 0x1008FF4E,
 | 
			
		||||
  XF86XK_LaunchF: 0x1008FF4F,
 | 
			
		||||
  XF86XK_ApplicationLeft: 0x1008FF50,
 | 
			
		||||
  XF86XK_ApplicationRight: 0x1008FF51,
 | 
			
		||||
  XF86XK_Book: 0x1008FF52,
 | 
			
		||||
  XF86XK_CD: 0x1008FF53,
 | 
			
		||||
  XF86XK_Calculater: 0x1008FF54,
 | 
			
		||||
  XF86XK_Clear: 0x1008FF55,
 | 
			
		||||
  XF86XK_Close: 0x1008FF56,
 | 
			
		||||
  XF86XK_Copy: 0x1008FF57,
 | 
			
		||||
  XF86XK_Cut: 0x1008FF58,
 | 
			
		||||
  XF86XK_Display: 0x1008FF59,
 | 
			
		||||
  XF86XK_DOS: 0x1008FF5A,
 | 
			
		||||
  XF86XK_Documents: 0x1008FF5B,
 | 
			
		||||
  XF86XK_Excel: 0x1008FF5C,
 | 
			
		||||
  XF86XK_Explorer: 0x1008FF5D,
 | 
			
		||||
  XF86XK_Game: 0x1008FF5E,
 | 
			
		||||
  XF86XK_Go: 0x1008FF5F,
 | 
			
		||||
  XF86XK_iTouch: 0x1008FF60,
 | 
			
		||||
  XF86XK_LogOff: 0x1008FF61,
 | 
			
		||||
  XF86XK_Market: 0x1008FF62,
 | 
			
		||||
  XF86XK_Meeting: 0x1008FF63,
 | 
			
		||||
  XF86XK_MenuKB: 0x1008FF65,
 | 
			
		||||
  XF86XK_MenuPB: 0x1008FF66,
 | 
			
		||||
  XF86XK_MySites: 0x1008FF67,
 | 
			
		||||
  XF86XK_New: 0x1008FF68,
 | 
			
		||||
  XF86XK_News: 0x1008FF69,
 | 
			
		||||
  XF86XK_OfficeHome: 0x1008FF6A,
 | 
			
		||||
  XF86XK_Open: 0x1008FF6B,
 | 
			
		||||
  XF86XK_Option: 0x1008FF6C,
 | 
			
		||||
  XF86XK_Paste: 0x1008FF6D,
 | 
			
		||||
  XF86XK_Phone: 0x1008FF6E,
 | 
			
		||||
  XF86XK_Q: 0x1008FF70,
 | 
			
		||||
  XF86XK_Reply: 0x1008FF72,
 | 
			
		||||
  XF86XK_Reload: 0x1008FF73,
 | 
			
		||||
  XF86XK_RotateWindows: 0x1008FF74,
 | 
			
		||||
  XF86XK_RotationPB: 0x1008FF75,
 | 
			
		||||
  XF86XK_RotationKB: 0x1008FF76,
 | 
			
		||||
  XF86XK_Save: 0x1008FF77,
 | 
			
		||||
  XF86XK_ScrollUp: 0x1008FF78,
 | 
			
		||||
  XF86XK_ScrollDown: 0x1008FF79,
 | 
			
		||||
  XF86XK_ScrollClick: 0x1008FF7A,
 | 
			
		||||
  XF86XK_Send: 0x1008FF7B,
 | 
			
		||||
  XF86XK_Spell: 0x1008FF7C,
 | 
			
		||||
  XF86XK_SplitScreen: 0x1008FF7D,
 | 
			
		||||
  XF86XK_Support: 0x1008FF7E,
 | 
			
		||||
  XF86XK_TaskPane: 0x1008FF7F,
 | 
			
		||||
  XF86XK_Terminal: 0x1008FF80,
 | 
			
		||||
  XF86XK_Tools: 0x1008FF81,
 | 
			
		||||
  XF86XK_Travel: 0x1008FF82,
 | 
			
		||||
  XF86XK_UserPB: 0x1008FF84,
 | 
			
		||||
  XF86XK_User1KB: 0x1008FF85,
 | 
			
		||||
  XF86XK_User2KB: 0x1008FF86,
 | 
			
		||||
  XF86XK_Video: 0x1008FF87,
 | 
			
		||||
  XF86XK_WheelButton: 0x1008FF88,
 | 
			
		||||
  XF86XK_Word: 0x1008FF89,
 | 
			
		||||
  XF86XK_Xfer: 0x1008FF8A,
 | 
			
		||||
  XF86XK_ZoomIn: 0x1008FF8B,
 | 
			
		||||
  XF86XK_ZoomOut: 0x1008FF8C,
 | 
			
		||||
  XF86XK_Away: 0x1008FF8D,
 | 
			
		||||
  XF86XK_Messenger: 0x1008FF8E,
 | 
			
		||||
  XF86XK_WebCam: 0x1008FF8F,
 | 
			
		||||
  XF86XK_MailForward: 0x1008FF90,
 | 
			
		||||
  XF86XK_Pictures: 0x1008FF91,
 | 
			
		||||
  XF86XK_Music: 0x1008FF92,
 | 
			
		||||
  XF86XK_Battery: 0x1008FF93,
 | 
			
		||||
  XF86XK_Bluetooth: 0x1008FF94,
 | 
			
		||||
  XF86XK_WLAN: 0x1008FF95,
 | 
			
		||||
  XF86XK_UWB: 0x1008FF96,
 | 
			
		||||
  XF86XK_AudioForward: 0x1008FF97,
 | 
			
		||||
  XF86XK_AudioRepeat: 0x1008FF98,
 | 
			
		||||
  XF86XK_AudioRandomPlay: 0x1008FF99,
 | 
			
		||||
  XF86XK_Subtitle: 0x1008FF9A,
 | 
			
		||||
  XF86XK_AudioCycleTrack: 0x1008FF9B,
 | 
			
		||||
  XF86XK_CycleAngle: 0x1008FF9C,
 | 
			
		||||
  XF86XK_FrameBack: 0x1008FF9D,
 | 
			
		||||
  XF86XK_FrameForward: 0x1008FF9E,
 | 
			
		||||
  XF86XK_Time: 0x1008FF9F,
 | 
			
		||||
  XF86XK_Select: 0x1008FFA0,
 | 
			
		||||
  XF86XK_View: 0x1008FFA1,
 | 
			
		||||
  XF86XK_TopMenu: 0x1008FFA2,
 | 
			
		||||
  XF86XK_Red: 0x1008FFA3,
 | 
			
		||||
  XF86XK_Green: 0x1008FFA4,
 | 
			
		||||
  XF86XK_Yellow: 0x1008FFA5,
 | 
			
		||||
  XF86XK_Blue: 0x1008FFA6,
 | 
			
		||||
  XF86XK_Suspend: 0x1008FFA7,
 | 
			
		||||
  XF86XK_Hibernate: 0x1008FFA8,
 | 
			
		||||
  XF86XK_TouchpadToggle: 0x1008FFA9,
 | 
			
		||||
  XF86XK_TouchpadOn: 0x1008FFB0,
 | 
			
		||||
  XF86XK_TouchpadOff: 0x1008FFB1,
 | 
			
		||||
  XF86XK_AudioMicMute: 0x1008FFB2,
 | 
			
		||||
  XF86XK_Switch_VT_1: 0x1008FE01,
 | 
			
		||||
  XF86XK_Switch_VT_2: 0x1008FE02,
 | 
			
		||||
  XF86XK_Switch_VT_3: 0x1008FE03,
 | 
			
		||||
  XF86XK_Switch_VT_4: 0x1008FE04,
 | 
			
		||||
  XF86XK_Switch_VT_5: 0x1008FE05,
 | 
			
		||||
  XF86XK_Switch_VT_6: 0x1008FE06,
 | 
			
		||||
  XF86XK_Switch_VT_7: 0x1008FE07,
 | 
			
		||||
  XF86XK_Switch_VT_8: 0x1008FE08,
 | 
			
		||||
  XF86XK_Switch_VT_9: 0x1008FE09,
 | 
			
		||||
  XF86XK_Switch_VT_10: 0x1008FE0A,
 | 
			
		||||
  XF86XK_Switch_VT_11: 0x1008FE0B,
 | 
			
		||||
  XF86XK_Switch_VT_12: 0x1008FE0C,
 | 
			
		||||
  XF86XK_Ungrab: 0x1008FE20,
 | 
			
		||||
  XF86XK_ClearGrab: 0x1008FE21,
 | 
			
		||||
  XF86XK_Next_VMode: 0x1008FE22,
 | 
			
		||||
  XF86XK_Prev_VMode: 0x1008FE23,
 | 
			
		||||
  XF86XK_LogWindowTree: 0x1008FE24,
 | 
			
		||||
  XF86XK_LogGrabInfo: 0x1008FE25
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										693
									
								
								static/js/novnc/core/input/keysymdef.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,693 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
/*
 | 
			
		||||
 * Mapping from Unicode codepoints to X11/RFB keysyms
 | 
			
		||||
 *
 | 
			
		||||
 * This file was automatically generated from keysymdef.h
 | 
			
		||||
 * DO NOT EDIT!
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Functions at the bottom */
 | 
			
		||||
 | 
			
		||||
var codepoints = {
 | 
			
		||||
    0x0100: 0x03c0, // XK_Amacron
 | 
			
		||||
    0x0101: 0x03e0, // XK_amacron
 | 
			
		||||
    0x0102: 0x01c3, // XK_Abreve
 | 
			
		||||
    0x0103: 0x01e3, // XK_abreve
 | 
			
		||||
    0x0104: 0x01a1, // XK_Aogonek
 | 
			
		||||
    0x0105: 0x01b1, // XK_aogonek
 | 
			
		||||
    0x0106: 0x01c6, // XK_Cacute
 | 
			
		||||
    0x0107: 0x01e6, // XK_cacute
 | 
			
		||||
    0x0108: 0x02c6, // XK_Ccircumflex
 | 
			
		||||
    0x0109: 0x02e6, // XK_ccircumflex
 | 
			
		||||
    0x010a: 0x02c5, // XK_Cabovedot
 | 
			
		||||
    0x010b: 0x02e5, // XK_cabovedot
 | 
			
		||||
    0x010c: 0x01c8, // XK_Ccaron
 | 
			
		||||
    0x010d: 0x01e8, // XK_ccaron
 | 
			
		||||
    0x010e: 0x01cf, // XK_Dcaron
 | 
			
		||||
    0x010f: 0x01ef, // XK_dcaron
 | 
			
		||||
    0x0110: 0x01d0, // XK_Dstroke
 | 
			
		||||
    0x0111: 0x01f0, // XK_dstroke
 | 
			
		||||
    0x0112: 0x03aa, // XK_Emacron
 | 
			
		||||
    0x0113: 0x03ba, // XK_emacron
 | 
			
		||||
    0x0116: 0x03cc, // XK_Eabovedot
 | 
			
		||||
    0x0117: 0x03ec, // XK_eabovedot
 | 
			
		||||
    0x0118: 0x01ca, // XK_Eogonek
 | 
			
		||||
    0x0119: 0x01ea, // XK_eogonek
 | 
			
		||||
    0x011a: 0x01cc, // XK_Ecaron
 | 
			
		||||
    0x011b: 0x01ec, // XK_ecaron
 | 
			
		||||
    0x011c: 0x02d8, // XK_Gcircumflex
 | 
			
		||||
    0x011d: 0x02f8, // XK_gcircumflex
 | 
			
		||||
    0x011e: 0x02ab, // XK_Gbreve
 | 
			
		||||
    0x011f: 0x02bb, // XK_gbreve
 | 
			
		||||
    0x0120: 0x02d5, // XK_Gabovedot
 | 
			
		||||
    0x0121: 0x02f5, // XK_gabovedot
 | 
			
		||||
    0x0122: 0x03ab, // XK_Gcedilla
 | 
			
		||||
    0x0123: 0x03bb, // XK_gcedilla
 | 
			
		||||
    0x0124: 0x02a6, // XK_Hcircumflex
 | 
			
		||||
    0x0125: 0x02b6, // XK_hcircumflex
 | 
			
		||||
    0x0126: 0x02a1, // XK_Hstroke
 | 
			
		||||
    0x0127: 0x02b1, // XK_hstroke
 | 
			
		||||
    0x0128: 0x03a5, // XK_Itilde
 | 
			
		||||
    0x0129: 0x03b5, // XK_itilde
 | 
			
		||||
    0x012a: 0x03cf, // XK_Imacron
 | 
			
		||||
    0x012b: 0x03ef, // XK_imacron
 | 
			
		||||
    0x012e: 0x03c7, // XK_Iogonek
 | 
			
		||||
    0x012f: 0x03e7, // XK_iogonek
 | 
			
		||||
    0x0130: 0x02a9, // XK_Iabovedot
 | 
			
		||||
    0x0131: 0x02b9, // XK_idotless
 | 
			
		||||
    0x0134: 0x02ac, // XK_Jcircumflex
 | 
			
		||||
    0x0135: 0x02bc, // XK_jcircumflex
 | 
			
		||||
    0x0136: 0x03d3, // XK_Kcedilla
 | 
			
		||||
    0x0137: 0x03f3, // XK_kcedilla
 | 
			
		||||
    0x0138: 0x03a2, // XK_kra
 | 
			
		||||
    0x0139: 0x01c5, // XK_Lacute
 | 
			
		||||
    0x013a: 0x01e5, // XK_lacute
 | 
			
		||||
    0x013b: 0x03a6, // XK_Lcedilla
 | 
			
		||||
    0x013c: 0x03b6, // XK_lcedilla
 | 
			
		||||
    0x013d: 0x01a5, // XK_Lcaron
 | 
			
		||||
    0x013e: 0x01b5, // XK_lcaron
 | 
			
		||||
    0x0141: 0x01a3, // XK_Lstroke
 | 
			
		||||
    0x0142: 0x01b3, // XK_lstroke
 | 
			
		||||
    0x0143: 0x01d1, // XK_Nacute
 | 
			
		||||
    0x0144: 0x01f1, // XK_nacute
 | 
			
		||||
    0x0145: 0x03d1, // XK_Ncedilla
 | 
			
		||||
    0x0146: 0x03f1, // XK_ncedilla
 | 
			
		||||
    0x0147: 0x01d2, // XK_Ncaron
 | 
			
		||||
    0x0148: 0x01f2, // XK_ncaron
 | 
			
		||||
    0x014a: 0x03bd, // XK_ENG
 | 
			
		||||
    0x014b: 0x03bf, // XK_eng
 | 
			
		||||
    0x014c: 0x03d2, // XK_Omacron
 | 
			
		||||
    0x014d: 0x03f2, // XK_omacron
 | 
			
		||||
    0x0150: 0x01d5, // XK_Odoubleacute
 | 
			
		||||
    0x0151: 0x01f5, // XK_odoubleacute
 | 
			
		||||
    0x0152: 0x13bc, // XK_OE
 | 
			
		||||
    0x0153: 0x13bd, // XK_oe
 | 
			
		||||
    0x0154: 0x01c0, // XK_Racute
 | 
			
		||||
    0x0155: 0x01e0, // XK_racute
 | 
			
		||||
    0x0156: 0x03a3, // XK_Rcedilla
 | 
			
		||||
    0x0157: 0x03b3, // XK_rcedilla
 | 
			
		||||
    0x0158: 0x01d8, // XK_Rcaron
 | 
			
		||||
    0x0159: 0x01f8, // XK_rcaron
 | 
			
		||||
    0x015a: 0x01a6, // XK_Sacute
 | 
			
		||||
    0x015b: 0x01b6, // XK_sacute
 | 
			
		||||
    0x015c: 0x02de, // XK_Scircumflex
 | 
			
		||||
    0x015d: 0x02fe, // XK_scircumflex
 | 
			
		||||
    0x015e: 0x01aa, // XK_Scedilla
 | 
			
		||||
    0x015f: 0x01ba, // XK_scedilla
 | 
			
		||||
    0x0160: 0x01a9, // XK_Scaron
 | 
			
		||||
    0x0161: 0x01b9, // XK_scaron
 | 
			
		||||
    0x0162: 0x01de, // XK_Tcedilla
 | 
			
		||||
    0x0163: 0x01fe, // XK_tcedilla
 | 
			
		||||
    0x0164: 0x01ab, // XK_Tcaron
 | 
			
		||||
    0x0165: 0x01bb, // XK_tcaron
 | 
			
		||||
    0x0166: 0x03ac, // XK_Tslash
 | 
			
		||||
    0x0167: 0x03bc, // XK_tslash
 | 
			
		||||
    0x0168: 0x03dd, // XK_Utilde
 | 
			
		||||
    0x0169: 0x03fd, // XK_utilde
 | 
			
		||||
    0x016a: 0x03de, // XK_Umacron
 | 
			
		||||
    0x016b: 0x03fe, // XK_umacron
 | 
			
		||||
    0x016c: 0x02dd, // XK_Ubreve
 | 
			
		||||
    0x016d: 0x02fd, // XK_ubreve
 | 
			
		||||
    0x016e: 0x01d9, // XK_Uring
 | 
			
		||||
    0x016f: 0x01f9, // XK_uring
 | 
			
		||||
    0x0170: 0x01db, // XK_Udoubleacute
 | 
			
		||||
    0x0171: 0x01fb, // XK_udoubleacute
 | 
			
		||||
    0x0172: 0x03d9, // XK_Uogonek
 | 
			
		||||
    0x0173: 0x03f9, // XK_uogonek
 | 
			
		||||
    0x0178: 0x13be, // XK_Ydiaeresis
 | 
			
		||||
    0x0179: 0x01ac, // XK_Zacute
 | 
			
		||||
    0x017a: 0x01bc, // XK_zacute
 | 
			
		||||
    0x017b: 0x01af, // XK_Zabovedot
 | 
			
		||||
    0x017c: 0x01bf, // XK_zabovedot
 | 
			
		||||
    0x017d: 0x01ae, // XK_Zcaron
 | 
			
		||||
    0x017e: 0x01be, // XK_zcaron
 | 
			
		||||
    0x0192: 0x08f6, // XK_function
 | 
			
		||||
    0x01d2: 0x10001d1, // XK_Ocaron
 | 
			
		||||
    0x02c7: 0x01b7, // XK_caron
 | 
			
		||||
    0x02d8: 0x01a2, // XK_breve
 | 
			
		||||
    0x02d9: 0x01ff, // XK_abovedot
 | 
			
		||||
    0x02db: 0x01b2, // XK_ogonek
 | 
			
		||||
    0x02dd: 0x01bd, // XK_doubleacute
 | 
			
		||||
    0x0385: 0x07ae, // XK_Greek_accentdieresis
 | 
			
		||||
    0x0386: 0x07a1, // XK_Greek_ALPHAaccent
 | 
			
		||||
    0x0388: 0x07a2, // XK_Greek_EPSILONaccent
 | 
			
		||||
    0x0389: 0x07a3, // XK_Greek_ETAaccent
 | 
			
		||||
    0x038a: 0x07a4, // XK_Greek_IOTAaccent
 | 
			
		||||
    0x038c: 0x07a7, // XK_Greek_OMICRONaccent
 | 
			
		||||
    0x038e: 0x07a8, // XK_Greek_UPSILONaccent
 | 
			
		||||
    0x038f: 0x07ab, // XK_Greek_OMEGAaccent
 | 
			
		||||
    0x0390: 0x07b6, // XK_Greek_iotaaccentdieresis
 | 
			
		||||
    0x0391: 0x07c1, // XK_Greek_ALPHA
 | 
			
		||||
    0x0392: 0x07c2, // XK_Greek_BETA
 | 
			
		||||
    0x0393: 0x07c3, // XK_Greek_GAMMA
 | 
			
		||||
    0x0394: 0x07c4, // XK_Greek_DELTA
 | 
			
		||||
    0x0395: 0x07c5, // XK_Greek_EPSILON
 | 
			
		||||
    0x0396: 0x07c6, // XK_Greek_ZETA
 | 
			
		||||
    0x0397: 0x07c7, // XK_Greek_ETA
 | 
			
		||||
    0x0398: 0x07c8, // XK_Greek_THETA
 | 
			
		||||
    0x0399: 0x07c9, // XK_Greek_IOTA
 | 
			
		||||
    0x039a: 0x07ca, // XK_Greek_KAPPA
 | 
			
		||||
    0x039b: 0x07cb, // XK_Greek_LAMDA
 | 
			
		||||
    0x039c: 0x07cc, // XK_Greek_MU
 | 
			
		||||
    0x039d: 0x07cd, // XK_Greek_NU
 | 
			
		||||
    0x039e: 0x07ce, // XK_Greek_XI
 | 
			
		||||
    0x039f: 0x07cf, // XK_Greek_OMICRON
 | 
			
		||||
    0x03a0: 0x07d0, // XK_Greek_PI
 | 
			
		||||
    0x03a1: 0x07d1, // XK_Greek_RHO
 | 
			
		||||
    0x03a3: 0x07d2, // XK_Greek_SIGMA
 | 
			
		||||
    0x03a4: 0x07d4, // XK_Greek_TAU
 | 
			
		||||
    0x03a5: 0x07d5, // XK_Greek_UPSILON
 | 
			
		||||
    0x03a6: 0x07d6, // XK_Greek_PHI
 | 
			
		||||
    0x03a7: 0x07d7, // XK_Greek_CHI
 | 
			
		||||
    0x03a8: 0x07d8, // XK_Greek_PSI
 | 
			
		||||
    0x03a9: 0x07d9, // XK_Greek_OMEGA
 | 
			
		||||
    0x03aa: 0x07a5, // XK_Greek_IOTAdieresis
 | 
			
		||||
    0x03ab: 0x07a9, // XK_Greek_UPSILONdieresis
 | 
			
		||||
    0x03ac: 0x07b1, // XK_Greek_alphaaccent
 | 
			
		||||
    0x03ad: 0x07b2, // XK_Greek_epsilonaccent
 | 
			
		||||
    0x03ae: 0x07b3, // XK_Greek_etaaccent
 | 
			
		||||
    0x03af: 0x07b4, // XK_Greek_iotaaccent
 | 
			
		||||
    0x03b0: 0x07ba, // XK_Greek_upsilonaccentdieresis
 | 
			
		||||
    0x03b1: 0x07e1, // XK_Greek_alpha
 | 
			
		||||
    0x03b2: 0x07e2, // XK_Greek_beta
 | 
			
		||||
    0x03b3: 0x07e3, // XK_Greek_gamma
 | 
			
		||||
    0x03b4: 0x07e4, // XK_Greek_delta
 | 
			
		||||
    0x03b5: 0x07e5, // XK_Greek_epsilon
 | 
			
		||||
    0x03b6: 0x07e6, // XK_Greek_zeta
 | 
			
		||||
    0x03b7: 0x07e7, // XK_Greek_eta
 | 
			
		||||
    0x03b8: 0x07e8, // XK_Greek_theta
 | 
			
		||||
    0x03b9: 0x07e9, // XK_Greek_iota
 | 
			
		||||
    0x03ba: 0x07ea, // XK_Greek_kappa
 | 
			
		||||
    0x03bb: 0x07eb, // XK_Greek_lamda
 | 
			
		||||
    0x03bc: 0x07ec, // XK_Greek_mu
 | 
			
		||||
    0x03bd: 0x07ed, // XK_Greek_nu
 | 
			
		||||
    0x03be: 0x07ee, // XK_Greek_xi
 | 
			
		||||
    0x03bf: 0x07ef, // XK_Greek_omicron
 | 
			
		||||
    0x03c0: 0x07f0, // XK_Greek_pi
 | 
			
		||||
    0x03c1: 0x07f1, // XK_Greek_rho
 | 
			
		||||
    0x03c2: 0x07f3, // XK_Greek_finalsmallsigma
 | 
			
		||||
    0x03c3: 0x07f2, // XK_Greek_sigma
 | 
			
		||||
    0x03c4: 0x07f4, // XK_Greek_tau
 | 
			
		||||
    0x03c5: 0x07f5, // XK_Greek_upsilon
 | 
			
		||||
    0x03c6: 0x07f6, // XK_Greek_phi
 | 
			
		||||
    0x03c7: 0x07f7, // XK_Greek_chi
 | 
			
		||||
    0x03c8: 0x07f8, // XK_Greek_psi
 | 
			
		||||
    0x03c9: 0x07f9, // XK_Greek_omega
 | 
			
		||||
    0x03ca: 0x07b5, // XK_Greek_iotadieresis
 | 
			
		||||
    0x03cb: 0x07b9, // XK_Greek_upsilondieresis
 | 
			
		||||
    0x03cc: 0x07b7, // XK_Greek_omicronaccent
 | 
			
		||||
    0x03cd: 0x07b8, // XK_Greek_upsilonaccent
 | 
			
		||||
    0x03ce: 0x07bb, // XK_Greek_omegaaccent
 | 
			
		||||
    0x0401: 0x06b3, // XK_Cyrillic_IO
 | 
			
		||||
    0x0402: 0x06b1, // XK_Serbian_DJE
 | 
			
		||||
    0x0403: 0x06b2, // XK_Macedonia_GJE
 | 
			
		||||
    0x0404: 0x06b4, // XK_Ukrainian_IE
 | 
			
		||||
    0x0405: 0x06b5, // XK_Macedonia_DSE
 | 
			
		||||
    0x0406: 0x06b6, // XK_Ukrainian_I
 | 
			
		||||
    0x0407: 0x06b7, // XK_Ukrainian_YI
 | 
			
		||||
    0x0408: 0x06b8, // XK_Cyrillic_JE
 | 
			
		||||
    0x0409: 0x06b9, // XK_Cyrillic_LJE
 | 
			
		||||
    0x040a: 0x06ba, // XK_Cyrillic_NJE
 | 
			
		||||
    0x040b: 0x06bb, // XK_Serbian_TSHE
 | 
			
		||||
    0x040c: 0x06bc, // XK_Macedonia_KJE
 | 
			
		||||
    0x040e: 0x06be, // XK_Byelorussian_SHORTU
 | 
			
		||||
    0x040f: 0x06bf, // XK_Cyrillic_DZHE
 | 
			
		||||
    0x0410: 0x06e1, // XK_Cyrillic_A
 | 
			
		||||
    0x0411: 0x06e2, // XK_Cyrillic_BE
 | 
			
		||||
    0x0412: 0x06f7, // XK_Cyrillic_VE
 | 
			
		||||
    0x0413: 0x06e7, // XK_Cyrillic_GHE
 | 
			
		||||
    0x0414: 0x06e4, // XK_Cyrillic_DE
 | 
			
		||||
    0x0415: 0x06e5, // XK_Cyrillic_IE
 | 
			
		||||
    0x0416: 0x06f6, // XK_Cyrillic_ZHE
 | 
			
		||||
    0x0417: 0x06fa, // XK_Cyrillic_ZE
 | 
			
		||||
    0x0418: 0x06e9, // XK_Cyrillic_I
 | 
			
		||||
    0x0419: 0x06ea, // XK_Cyrillic_SHORTI
 | 
			
		||||
    0x041a: 0x06eb, // XK_Cyrillic_KA
 | 
			
		||||
    0x041b: 0x06ec, // XK_Cyrillic_EL
 | 
			
		||||
    0x041c: 0x06ed, // XK_Cyrillic_EM
 | 
			
		||||
    0x041d: 0x06ee, // XK_Cyrillic_EN
 | 
			
		||||
    0x041e: 0x06ef, // XK_Cyrillic_O
 | 
			
		||||
    0x041f: 0x06f0, // XK_Cyrillic_PE
 | 
			
		||||
    0x0420: 0x06f2, // XK_Cyrillic_ER
 | 
			
		||||
    0x0421: 0x06f3, // XK_Cyrillic_ES
 | 
			
		||||
    0x0422: 0x06f4, // XK_Cyrillic_TE
 | 
			
		||||
    0x0423: 0x06f5, // XK_Cyrillic_U
 | 
			
		||||
    0x0424: 0x06e6, // XK_Cyrillic_EF
 | 
			
		||||
    0x0425: 0x06e8, // XK_Cyrillic_HA
 | 
			
		||||
    0x0426: 0x06e3, // XK_Cyrillic_TSE
 | 
			
		||||
    0x0427: 0x06fe, // XK_Cyrillic_CHE
 | 
			
		||||
    0x0428: 0x06fb, // XK_Cyrillic_SHA
 | 
			
		||||
    0x0429: 0x06fd, // XK_Cyrillic_SHCHA
 | 
			
		||||
    0x042a: 0x06ff, // XK_Cyrillic_HARDSIGN
 | 
			
		||||
    0x042b: 0x06f9, // XK_Cyrillic_YERU
 | 
			
		||||
    0x042c: 0x06f8, // XK_Cyrillic_SOFTSIGN
 | 
			
		||||
    0x042d: 0x06fc, // XK_Cyrillic_E
 | 
			
		||||
    0x042e: 0x06e0, // XK_Cyrillic_YU
 | 
			
		||||
    0x042f: 0x06f1, // XK_Cyrillic_YA
 | 
			
		||||
    0x0430: 0x06c1, // XK_Cyrillic_a
 | 
			
		||||
    0x0431: 0x06c2, // XK_Cyrillic_be
 | 
			
		||||
    0x0432: 0x06d7, // XK_Cyrillic_ve
 | 
			
		||||
    0x0433: 0x06c7, // XK_Cyrillic_ghe
 | 
			
		||||
    0x0434: 0x06c4, // XK_Cyrillic_de
 | 
			
		||||
    0x0435: 0x06c5, // XK_Cyrillic_ie
 | 
			
		||||
    0x0436: 0x06d6, // XK_Cyrillic_zhe
 | 
			
		||||
    0x0437: 0x06da, // XK_Cyrillic_ze
 | 
			
		||||
    0x0438: 0x06c9, // XK_Cyrillic_i
 | 
			
		||||
    0x0439: 0x06ca, // XK_Cyrillic_shorti
 | 
			
		||||
    0x043a: 0x06cb, // XK_Cyrillic_ka
 | 
			
		||||
    0x043b: 0x06cc, // XK_Cyrillic_el
 | 
			
		||||
    0x043c: 0x06cd, // XK_Cyrillic_em
 | 
			
		||||
    0x043d: 0x06ce, // XK_Cyrillic_en
 | 
			
		||||
    0x043e: 0x06cf, // XK_Cyrillic_o
 | 
			
		||||
    0x043f: 0x06d0, // XK_Cyrillic_pe
 | 
			
		||||
    0x0440: 0x06d2, // XK_Cyrillic_er
 | 
			
		||||
    0x0441: 0x06d3, // XK_Cyrillic_es
 | 
			
		||||
    0x0442: 0x06d4, // XK_Cyrillic_te
 | 
			
		||||
    0x0443: 0x06d5, // XK_Cyrillic_u
 | 
			
		||||
    0x0444: 0x06c6, // XK_Cyrillic_ef
 | 
			
		||||
    0x0445: 0x06c8, // XK_Cyrillic_ha
 | 
			
		||||
    0x0446: 0x06c3, // XK_Cyrillic_tse
 | 
			
		||||
    0x0447: 0x06de, // XK_Cyrillic_che
 | 
			
		||||
    0x0448: 0x06db, // XK_Cyrillic_sha
 | 
			
		||||
    0x0449: 0x06dd, // XK_Cyrillic_shcha
 | 
			
		||||
    0x044a: 0x06df, // XK_Cyrillic_hardsign
 | 
			
		||||
    0x044b: 0x06d9, // XK_Cyrillic_yeru
 | 
			
		||||
    0x044c: 0x06d8, // XK_Cyrillic_softsign
 | 
			
		||||
    0x044d: 0x06dc, // XK_Cyrillic_e
 | 
			
		||||
    0x044e: 0x06c0, // XK_Cyrillic_yu
 | 
			
		||||
    0x044f: 0x06d1, // XK_Cyrillic_ya
 | 
			
		||||
    0x0451: 0x06a3, // XK_Cyrillic_io
 | 
			
		||||
    0x0452: 0x06a1, // XK_Serbian_dje
 | 
			
		||||
    0x0453: 0x06a2, // XK_Macedonia_gje
 | 
			
		||||
    0x0454: 0x06a4, // XK_Ukrainian_ie
 | 
			
		||||
    0x0455: 0x06a5, // XK_Macedonia_dse
 | 
			
		||||
    0x0456: 0x06a6, // XK_Ukrainian_i
 | 
			
		||||
    0x0457: 0x06a7, // XK_Ukrainian_yi
 | 
			
		||||
    0x0458: 0x06a8, // XK_Cyrillic_je
 | 
			
		||||
    0x0459: 0x06a9, // XK_Cyrillic_lje
 | 
			
		||||
    0x045a: 0x06aa, // XK_Cyrillic_nje
 | 
			
		||||
    0x045b: 0x06ab, // XK_Serbian_tshe
 | 
			
		||||
    0x045c: 0x06ac, // XK_Macedonia_kje
 | 
			
		||||
    0x045e: 0x06ae, // XK_Byelorussian_shortu
 | 
			
		||||
    0x045f: 0x06af, // XK_Cyrillic_dzhe
 | 
			
		||||
    0x0490: 0x06bd, // XK_Ukrainian_GHE_WITH_UPTURN
 | 
			
		||||
    0x0491: 0x06ad, // XK_Ukrainian_ghe_with_upturn
 | 
			
		||||
    0x05d0: 0x0ce0, // XK_hebrew_aleph
 | 
			
		||||
    0x05d1: 0x0ce1, // XK_hebrew_bet
 | 
			
		||||
    0x05d2: 0x0ce2, // XK_hebrew_gimel
 | 
			
		||||
    0x05d3: 0x0ce3, // XK_hebrew_dalet
 | 
			
		||||
    0x05d4: 0x0ce4, // XK_hebrew_he
 | 
			
		||||
    0x05d5: 0x0ce5, // XK_hebrew_waw
 | 
			
		||||
    0x05d6: 0x0ce6, // XK_hebrew_zain
 | 
			
		||||
    0x05d7: 0x0ce7, // XK_hebrew_chet
 | 
			
		||||
    0x05d8: 0x0ce8, // XK_hebrew_tet
 | 
			
		||||
    0x05d9: 0x0ce9, // XK_hebrew_yod
 | 
			
		||||
    0x05da: 0x0cea, // XK_hebrew_finalkaph
 | 
			
		||||
    0x05db: 0x0ceb, // XK_hebrew_kaph
 | 
			
		||||
    0x05dc: 0x0cec, // XK_hebrew_lamed
 | 
			
		||||
    0x05dd: 0x0ced, // XK_hebrew_finalmem
 | 
			
		||||
    0x05de: 0x0cee, // XK_hebrew_mem
 | 
			
		||||
    0x05df: 0x0cef, // XK_hebrew_finalnun
 | 
			
		||||
    0x05e0: 0x0cf0, // XK_hebrew_nun
 | 
			
		||||
    0x05e1: 0x0cf1, // XK_hebrew_samech
 | 
			
		||||
    0x05e2: 0x0cf2, // XK_hebrew_ayin
 | 
			
		||||
    0x05e3: 0x0cf3, // XK_hebrew_finalpe
 | 
			
		||||
    0x05e4: 0x0cf4, // XK_hebrew_pe
 | 
			
		||||
    0x05e5: 0x0cf5, // XK_hebrew_finalzade
 | 
			
		||||
    0x05e6: 0x0cf6, // XK_hebrew_zade
 | 
			
		||||
    0x05e7: 0x0cf7, // XK_hebrew_qoph
 | 
			
		||||
    0x05e8: 0x0cf8, // XK_hebrew_resh
 | 
			
		||||
    0x05e9: 0x0cf9, // XK_hebrew_shin
 | 
			
		||||
    0x05ea: 0x0cfa, // XK_hebrew_taw
 | 
			
		||||
    0x060c: 0x05ac, // XK_Arabic_comma
 | 
			
		||||
    0x061b: 0x05bb, // XK_Arabic_semicolon
 | 
			
		||||
    0x061f: 0x05bf, // XK_Arabic_question_mark
 | 
			
		||||
    0x0621: 0x05c1, // XK_Arabic_hamza
 | 
			
		||||
    0x0622: 0x05c2, // XK_Arabic_maddaonalef
 | 
			
		||||
    0x0623: 0x05c3, // XK_Arabic_hamzaonalef
 | 
			
		||||
    0x0624: 0x05c4, // XK_Arabic_hamzaonwaw
 | 
			
		||||
    0x0625: 0x05c5, // XK_Arabic_hamzaunderalef
 | 
			
		||||
    0x0626: 0x05c6, // XK_Arabic_hamzaonyeh
 | 
			
		||||
    0x0627: 0x05c7, // XK_Arabic_alef
 | 
			
		||||
    0x0628: 0x05c8, // XK_Arabic_beh
 | 
			
		||||
    0x0629: 0x05c9, // XK_Arabic_tehmarbuta
 | 
			
		||||
    0x062a: 0x05ca, // XK_Arabic_teh
 | 
			
		||||
    0x062b: 0x05cb, // XK_Arabic_theh
 | 
			
		||||
    0x062c: 0x05cc, // XK_Arabic_jeem
 | 
			
		||||
    0x062d: 0x05cd, // XK_Arabic_hah
 | 
			
		||||
    0x062e: 0x05ce, // XK_Arabic_khah
 | 
			
		||||
    0x062f: 0x05cf, // XK_Arabic_dal
 | 
			
		||||
    0x0630: 0x05d0, // XK_Arabic_thal
 | 
			
		||||
    0x0631: 0x05d1, // XK_Arabic_ra
 | 
			
		||||
    0x0632: 0x05d2, // XK_Arabic_zain
 | 
			
		||||
    0x0633: 0x05d3, // XK_Arabic_seen
 | 
			
		||||
    0x0634: 0x05d4, // XK_Arabic_sheen
 | 
			
		||||
    0x0635: 0x05d5, // XK_Arabic_sad
 | 
			
		||||
    0x0636: 0x05d6, // XK_Arabic_dad
 | 
			
		||||
    0x0637: 0x05d7, // XK_Arabic_tah
 | 
			
		||||
    0x0638: 0x05d8, // XK_Arabic_zah
 | 
			
		||||
    0x0639: 0x05d9, // XK_Arabic_ain
 | 
			
		||||
    0x063a: 0x05da, // XK_Arabic_ghain
 | 
			
		||||
    0x0640: 0x05e0, // XK_Arabic_tatweel
 | 
			
		||||
    0x0641: 0x05e1, // XK_Arabic_feh
 | 
			
		||||
    0x0642: 0x05e2, // XK_Arabic_qaf
 | 
			
		||||
    0x0643: 0x05e3, // XK_Arabic_kaf
 | 
			
		||||
    0x0644: 0x05e4, // XK_Arabic_lam
 | 
			
		||||
    0x0645: 0x05e5, // XK_Arabic_meem
 | 
			
		||||
    0x0646: 0x05e6, // XK_Arabic_noon
 | 
			
		||||
    0x0647: 0x05e7, // XK_Arabic_ha
 | 
			
		||||
    0x0648: 0x05e8, // XK_Arabic_waw
 | 
			
		||||
    0x0649: 0x05e9, // XK_Arabic_alefmaksura
 | 
			
		||||
    0x064a: 0x05ea, // XK_Arabic_yeh
 | 
			
		||||
    0x064b: 0x05eb, // XK_Arabic_fathatan
 | 
			
		||||
    0x064c: 0x05ec, // XK_Arabic_dammatan
 | 
			
		||||
    0x064d: 0x05ed, // XK_Arabic_kasratan
 | 
			
		||||
    0x064e: 0x05ee, // XK_Arabic_fatha
 | 
			
		||||
    0x064f: 0x05ef, // XK_Arabic_damma
 | 
			
		||||
    0x0650: 0x05f0, // XK_Arabic_kasra
 | 
			
		||||
    0x0651: 0x05f1, // XK_Arabic_shadda
 | 
			
		||||
    0x0652: 0x05f2, // XK_Arabic_sukun
 | 
			
		||||
    0x0e01: 0x0da1, // XK_Thai_kokai
 | 
			
		||||
    0x0e02: 0x0da2, // XK_Thai_khokhai
 | 
			
		||||
    0x0e03: 0x0da3, // XK_Thai_khokhuat
 | 
			
		||||
    0x0e04: 0x0da4, // XK_Thai_khokhwai
 | 
			
		||||
    0x0e05: 0x0da5, // XK_Thai_khokhon
 | 
			
		||||
    0x0e06: 0x0da6, // XK_Thai_khorakhang
 | 
			
		||||
    0x0e07: 0x0da7, // XK_Thai_ngongu
 | 
			
		||||
    0x0e08: 0x0da8, // XK_Thai_chochan
 | 
			
		||||
    0x0e09: 0x0da9, // XK_Thai_choching
 | 
			
		||||
    0x0e0a: 0x0daa, // XK_Thai_chochang
 | 
			
		||||
    0x0e0b: 0x0dab, // XK_Thai_soso
 | 
			
		||||
    0x0e0c: 0x0dac, // XK_Thai_chochoe
 | 
			
		||||
    0x0e0d: 0x0dad, // XK_Thai_yoying
 | 
			
		||||
    0x0e0e: 0x0dae, // XK_Thai_dochada
 | 
			
		||||
    0x0e0f: 0x0daf, // XK_Thai_topatak
 | 
			
		||||
    0x0e10: 0x0db0, // XK_Thai_thothan
 | 
			
		||||
    0x0e11: 0x0db1, // XK_Thai_thonangmontho
 | 
			
		||||
    0x0e12: 0x0db2, // XK_Thai_thophuthao
 | 
			
		||||
    0x0e13: 0x0db3, // XK_Thai_nonen
 | 
			
		||||
    0x0e14: 0x0db4, // XK_Thai_dodek
 | 
			
		||||
    0x0e15: 0x0db5, // XK_Thai_totao
 | 
			
		||||
    0x0e16: 0x0db6, // XK_Thai_thothung
 | 
			
		||||
    0x0e17: 0x0db7, // XK_Thai_thothahan
 | 
			
		||||
    0x0e18: 0x0db8, // XK_Thai_thothong
 | 
			
		||||
    0x0e19: 0x0db9, // XK_Thai_nonu
 | 
			
		||||
    0x0e1a: 0x0dba, // XK_Thai_bobaimai
 | 
			
		||||
    0x0e1b: 0x0dbb, // XK_Thai_popla
 | 
			
		||||
    0x0e1c: 0x0dbc, // XK_Thai_phophung
 | 
			
		||||
    0x0e1d: 0x0dbd, // XK_Thai_fofa
 | 
			
		||||
    0x0e1e: 0x0dbe, // XK_Thai_phophan
 | 
			
		||||
    0x0e1f: 0x0dbf, // XK_Thai_fofan
 | 
			
		||||
    0x0e20: 0x0dc0, // XK_Thai_phosamphao
 | 
			
		||||
    0x0e21: 0x0dc1, // XK_Thai_moma
 | 
			
		||||
    0x0e22: 0x0dc2, // XK_Thai_yoyak
 | 
			
		||||
    0x0e23: 0x0dc3, // XK_Thai_rorua
 | 
			
		||||
    0x0e24: 0x0dc4, // XK_Thai_ru
 | 
			
		||||
    0x0e25: 0x0dc5, // XK_Thai_loling
 | 
			
		||||
    0x0e26: 0x0dc6, // XK_Thai_lu
 | 
			
		||||
    0x0e27: 0x0dc7, // XK_Thai_wowaen
 | 
			
		||||
    0x0e28: 0x0dc8, // XK_Thai_sosala
 | 
			
		||||
    0x0e29: 0x0dc9, // XK_Thai_sorusi
 | 
			
		||||
    0x0e2a: 0x0dca, // XK_Thai_sosua
 | 
			
		||||
    0x0e2b: 0x0dcb, // XK_Thai_hohip
 | 
			
		||||
    0x0e2c: 0x0dcc, // XK_Thai_lochula
 | 
			
		||||
    0x0e2d: 0x0dcd, // XK_Thai_oang
 | 
			
		||||
    0x0e2e: 0x0dce, // XK_Thai_honokhuk
 | 
			
		||||
    0x0e2f: 0x0dcf, // XK_Thai_paiyannoi
 | 
			
		||||
    0x0e30: 0x0dd0, // XK_Thai_saraa
 | 
			
		||||
    0x0e31: 0x0dd1, // XK_Thai_maihanakat
 | 
			
		||||
    0x0e32: 0x0dd2, // XK_Thai_saraaa
 | 
			
		||||
    0x0e33: 0x0dd3, // XK_Thai_saraam
 | 
			
		||||
    0x0e34: 0x0dd4, // XK_Thai_sarai
 | 
			
		||||
    0x0e35: 0x0dd5, // XK_Thai_saraii
 | 
			
		||||
    0x0e36: 0x0dd6, // XK_Thai_saraue
 | 
			
		||||
    0x0e37: 0x0dd7, // XK_Thai_sarauee
 | 
			
		||||
    0x0e38: 0x0dd8, // XK_Thai_sarau
 | 
			
		||||
    0x0e39: 0x0dd9, // XK_Thai_sarauu
 | 
			
		||||
    0x0e3a: 0x0dda, // XK_Thai_phinthu
 | 
			
		||||
    0x0e3f: 0x0ddf, // XK_Thai_baht
 | 
			
		||||
    0x0e40: 0x0de0, // XK_Thai_sarae
 | 
			
		||||
    0x0e41: 0x0de1, // XK_Thai_saraae
 | 
			
		||||
    0x0e42: 0x0de2, // XK_Thai_sarao
 | 
			
		||||
    0x0e43: 0x0de3, // XK_Thai_saraaimaimuan
 | 
			
		||||
    0x0e44: 0x0de4, // XK_Thai_saraaimaimalai
 | 
			
		||||
    0x0e45: 0x0de5, // XK_Thai_lakkhangyao
 | 
			
		||||
    0x0e46: 0x0de6, // XK_Thai_maiyamok
 | 
			
		||||
    0x0e47: 0x0de7, // XK_Thai_maitaikhu
 | 
			
		||||
    0x0e48: 0x0de8, // XK_Thai_maiek
 | 
			
		||||
    0x0e49: 0x0de9, // XK_Thai_maitho
 | 
			
		||||
    0x0e4a: 0x0dea, // XK_Thai_maitri
 | 
			
		||||
    0x0e4b: 0x0deb, // XK_Thai_maichattawa
 | 
			
		||||
    0x0e4c: 0x0dec, // XK_Thai_thanthakhat
 | 
			
		||||
    0x0e4d: 0x0ded, // XK_Thai_nikhahit
 | 
			
		||||
    0x0e50: 0x0df0, // XK_Thai_leksun
 | 
			
		||||
    0x0e51: 0x0df1, // XK_Thai_leknung
 | 
			
		||||
    0x0e52: 0x0df2, // XK_Thai_leksong
 | 
			
		||||
    0x0e53: 0x0df3, // XK_Thai_leksam
 | 
			
		||||
    0x0e54: 0x0df4, // XK_Thai_leksi
 | 
			
		||||
    0x0e55: 0x0df5, // XK_Thai_lekha
 | 
			
		||||
    0x0e56: 0x0df6, // XK_Thai_lekhok
 | 
			
		||||
    0x0e57: 0x0df7, // XK_Thai_lekchet
 | 
			
		||||
    0x0e58: 0x0df8, // XK_Thai_lekpaet
 | 
			
		||||
    0x0e59: 0x0df9, // XK_Thai_lekkao
 | 
			
		||||
    0x2002: 0x0aa2, // XK_enspace
 | 
			
		||||
    0x2003: 0x0aa1, // XK_emspace
 | 
			
		||||
    0x2004: 0x0aa3, // XK_em3space
 | 
			
		||||
    0x2005: 0x0aa4, // XK_em4space
 | 
			
		||||
    0x2007: 0x0aa5, // XK_digitspace
 | 
			
		||||
    0x2008: 0x0aa6, // XK_punctspace
 | 
			
		||||
    0x2009: 0x0aa7, // XK_thinspace
 | 
			
		||||
    0x200a: 0x0aa8, // XK_hairspace
 | 
			
		||||
    0x2012: 0x0abb, // XK_figdash
 | 
			
		||||
    0x2013: 0x0aaa, // XK_endash
 | 
			
		||||
    0x2014: 0x0aa9, // XK_emdash
 | 
			
		||||
    0x2015: 0x07af, // XK_Greek_horizbar
 | 
			
		||||
    0x2017: 0x0cdf, // XK_hebrew_doublelowline
 | 
			
		||||
    0x2018: 0x0ad0, // XK_leftsinglequotemark
 | 
			
		||||
    0x2019: 0x0ad1, // XK_rightsinglequotemark
 | 
			
		||||
    0x201a: 0x0afd, // XK_singlelowquotemark
 | 
			
		||||
    0x201c: 0x0ad2, // XK_leftdoublequotemark
 | 
			
		||||
    0x201d: 0x0ad3, // XK_rightdoublequotemark
 | 
			
		||||
    0x201e: 0x0afe, // XK_doublelowquotemark
 | 
			
		||||
    0x2020: 0x0af1, // XK_dagger
 | 
			
		||||
    0x2021: 0x0af2, // XK_doubledagger
 | 
			
		||||
    0x2022: 0x0ae6, // XK_enfilledcircbullet
 | 
			
		||||
    0x2025: 0x0aaf, // XK_doubbaselinedot
 | 
			
		||||
    0x2026: 0x0aae, // XK_ellipsis
 | 
			
		||||
    0x2030: 0x0ad5, // XK_permille
 | 
			
		||||
    0x2032: 0x0ad6, // XK_minutes
 | 
			
		||||
    0x2033: 0x0ad7, // XK_seconds
 | 
			
		||||
    0x2038: 0x0afc, // XK_caret
 | 
			
		||||
    0x203e: 0x047e, // XK_overline
 | 
			
		||||
    0x20a9: 0x0eff, // XK_Korean_Won
 | 
			
		||||
    0x20ac: 0x20ac, // XK_EuroSign
 | 
			
		||||
    0x2105: 0x0ab8, // XK_careof
 | 
			
		||||
    0x2116: 0x06b0, // XK_numerosign
 | 
			
		||||
    0x2117: 0x0afb, // XK_phonographcopyright
 | 
			
		||||
    0x211e: 0x0ad4, // XK_prescription
 | 
			
		||||
    0x2122: 0x0ac9, // XK_trademark
 | 
			
		||||
    0x2153: 0x0ab0, // XK_onethird
 | 
			
		||||
    0x2154: 0x0ab1, // XK_twothirds
 | 
			
		||||
    0x2155: 0x0ab2, // XK_onefifth
 | 
			
		||||
    0x2156: 0x0ab3, // XK_twofifths
 | 
			
		||||
    0x2157: 0x0ab4, // XK_threefifths
 | 
			
		||||
    0x2158: 0x0ab5, // XK_fourfifths
 | 
			
		||||
    0x2159: 0x0ab6, // XK_onesixth
 | 
			
		||||
    0x215a: 0x0ab7, // XK_fivesixths
 | 
			
		||||
    0x215b: 0x0ac3, // XK_oneeighth
 | 
			
		||||
    0x215c: 0x0ac4, // XK_threeeighths
 | 
			
		||||
    0x215d: 0x0ac5, // XK_fiveeighths
 | 
			
		||||
    0x215e: 0x0ac6, // XK_seveneighths
 | 
			
		||||
    0x2190: 0x08fb, // XK_leftarrow
 | 
			
		||||
    0x2191: 0x08fc, // XK_uparrow
 | 
			
		||||
    0x2192: 0x08fd, // XK_rightarrow
 | 
			
		||||
    0x2193: 0x08fe, // XK_downarrow
 | 
			
		||||
    0x21d2: 0x08ce, // XK_implies
 | 
			
		||||
    0x21d4: 0x08cd, // XK_ifonlyif
 | 
			
		||||
    0x2202: 0x08ef, // XK_partialderivative
 | 
			
		||||
    0x2207: 0x08c5, // XK_nabla
 | 
			
		||||
    0x2218: 0x0bca, // XK_jot
 | 
			
		||||
    0x221a: 0x08d6, // XK_radical
 | 
			
		||||
    0x221d: 0x08c1, // XK_variation
 | 
			
		||||
    0x221e: 0x08c2, // XK_infinity
 | 
			
		||||
    0x2227: 0x08de, // XK_logicaland
 | 
			
		||||
    0x2228: 0x08df, // XK_logicalor
 | 
			
		||||
    0x2229: 0x08dc, // XK_intersection
 | 
			
		||||
    0x222a: 0x08dd, // XK_union
 | 
			
		||||
    0x222b: 0x08bf, // XK_integral
 | 
			
		||||
    0x2234: 0x08c0, // XK_therefore
 | 
			
		||||
    0x223c: 0x08c8, // XK_approximate
 | 
			
		||||
    0x2243: 0x08c9, // XK_similarequal
 | 
			
		||||
    0x2245: 0x1002248, // XK_approxeq
 | 
			
		||||
    0x2260: 0x08bd, // XK_notequal
 | 
			
		||||
    0x2261: 0x08cf, // XK_identical
 | 
			
		||||
    0x2264: 0x08bc, // XK_lessthanequal
 | 
			
		||||
    0x2265: 0x08be, // XK_greaterthanequal
 | 
			
		||||
    0x2282: 0x08da, // XK_includedin
 | 
			
		||||
    0x2283: 0x08db, // XK_includes
 | 
			
		||||
    0x22a2: 0x0bfc, // XK_righttack
 | 
			
		||||
    0x22a3: 0x0bdc, // XK_lefttack
 | 
			
		||||
    0x22a4: 0x0bc2, // XK_downtack
 | 
			
		||||
    0x22a5: 0x0bce, // XK_uptack
 | 
			
		||||
    0x2308: 0x0bd3, // XK_upstile
 | 
			
		||||
    0x230a: 0x0bc4, // XK_downstile
 | 
			
		||||
    0x2315: 0x0afa, // XK_telephonerecorder
 | 
			
		||||
    0x2320: 0x08a4, // XK_topintegral
 | 
			
		||||
    0x2321: 0x08a5, // XK_botintegral
 | 
			
		||||
    0x2395: 0x0bcc, // XK_quad
 | 
			
		||||
    0x239b: 0x08ab, // XK_topleftparens
 | 
			
		||||
    0x239d: 0x08ac, // XK_botleftparens
 | 
			
		||||
    0x239e: 0x08ad, // XK_toprightparens
 | 
			
		||||
    0x23a0: 0x08ae, // XK_botrightparens
 | 
			
		||||
    0x23a1: 0x08a7, // XK_topleftsqbracket
 | 
			
		||||
    0x23a3: 0x08a8, // XK_botleftsqbracket
 | 
			
		||||
    0x23a4: 0x08a9, // XK_toprightsqbracket
 | 
			
		||||
    0x23a6: 0x08aa, // XK_botrightsqbracket
 | 
			
		||||
    0x23a8: 0x08af, // XK_leftmiddlecurlybrace
 | 
			
		||||
    0x23ac: 0x08b0, // XK_rightmiddlecurlybrace
 | 
			
		||||
    0x23b7: 0x08a1, // XK_leftradical
 | 
			
		||||
    0x23ba: 0x09ef, // XK_horizlinescan1
 | 
			
		||||
    0x23bb: 0x09f0, // XK_horizlinescan3
 | 
			
		||||
    0x23bc: 0x09f2, // XK_horizlinescan7
 | 
			
		||||
    0x23bd: 0x09f3, // XK_horizlinescan9
 | 
			
		||||
    0x2409: 0x09e2, // XK_ht
 | 
			
		||||
    0x240a: 0x09e5, // XK_lf
 | 
			
		||||
    0x240b: 0x09e9, // XK_vt
 | 
			
		||||
    0x240c: 0x09e3, // XK_ff
 | 
			
		||||
    0x240d: 0x09e4, // XK_cr
 | 
			
		||||
    0x2423: 0x0aac, // XK_signifblank
 | 
			
		||||
    0x2424: 0x09e8, // XK_nl
 | 
			
		||||
    0x2500: 0x08a3, // XK_horizconnector
 | 
			
		||||
    0x2502: 0x08a6, // XK_vertconnector
 | 
			
		||||
    0x250c: 0x08a2, // XK_topleftradical
 | 
			
		||||
    0x2510: 0x09eb, // XK_uprightcorner
 | 
			
		||||
    0x2514: 0x09ed, // XK_lowleftcorner
 | 
			
		||||
    0x2518: 0x09ea, // XK_lowrightcorner
 | 
			
		||||
    0x251c: 0x09f4, // XK_leftt
 | 
			
		||||
    0x2524: 0x09f5, // XK_rightt
 | 
			
		||||
    0x252c: 0x09f7, // XK_topt
 | 
			
		||||
    0x2534: 0x09f6, // XK_bott
 | 
			
		||||
    0x253c: 0x09ee, // XK_crossinglines
 | 
			
		||||
    0x2592: 0x09e1, // XK_checkerboard
 | 
			
		||||
    0x25aa: 0x0ae7, // XK_enfilledsqbullet
 | 
			
		||||
    0x25ab: 0x0ae1, // XK_enopensquarebullet
 | 
			
		||||
    0x25ac: 0x0adb, // XK_filledrectbullet
 | 
			
		||||
    0x25ad: 0x0ae2, // XK_openrectbullet
 | 
			
		||||
    0x25ae: 0x0adf, // XK_emfilledrect
 | 
			
		||||
    0x25af: 0x0acf, // XK_emopenrectangle
 | 
			
		||||
    0x25b2: 0x0ae8, // XK_filledtribulletup
 | 
			
		||||
    0x25b3: 0x0ae3, // XK_opentribulletup
 | 
			
		||||
    0x25b6: 0x0add, // XK_filledrighttribullet
 | 
			
		||||
    0x25b7: 0x0acd, // XK_rightopentriangle
 | 
			
		||||
    0x25bc: 0x0ae9, // XK_filledtribulletdown
 | 
			
		||||
    0x25bd: 0x0ae4, // XK_opentribulletdown
 | 
			
		||||
    0x25c0: 0x0adc, // XK_filledlefttribullet
 | 
			
		||||
    0x25c1: 0x0acc, // XK_leftopentriangle
 | 
			
		||||
    0x25c6: 0x09e0, // XK_soliddiamond
 | 
			
		||||
    0x25cb: 0x0ace, // XK_emopencircle
 | 
			
		||||
    0x25cf: 0x0ade, // XK_emfilledcircle
 | 
			
		||||
    0x25e6: 0x0ae0, // XK_enopencircbullet
 | 
			
		||||
    0x2606: 0x0ae5, // XK_openstar
 | 
			
		||||
    0x260e: 0x0af9, // XK_telephone
 | 
			
		||||
    0x2613: 0x0aca, // XK_signaturemark
 | 
			
		||||
    0x261c: 0x0aea, // XK_leftpointer
 | 
			
		||||
    0x261e: 0x0aeb, // XK_rightpointer
 | 
			
		||||
    0x2640: 0x0af8, // XK_femalesymbol
 | 
			
		||||
    0x2642: 0x0af7, // XK_malesymbol
 | 
			
		||||
    0x2663: 0x0aec, // XK_club
 | 
			
		||||
    0x2665: 0x0aee, // XK_heart
 | 
			
		||||
    0x2666: 0x0aed, // XK_diamond
 | 
			
		||||
    0x266d: 0x0af6, // XK_musicalflat
 | 
			
		||||
    0x266f: 0x0af5, // XK_musicalsharp
 | 
			
		||||
    0x2713: 0x0af3, // XK_checkmark
 | 
			
		||||
    0x2717: 0x0af4, // XK_ballotcross
 | 
			
		||||
    0x271d: 0x0ad9, // XK_latincross
 | 
			
		||||
    0x2720: 0x0af0, // XK_maltesecross
 | 
			
		||||
    0x27e8: 0x0abc, // XK_leftanglebracket
 | 
			
		||||
    0x27e9: 0x0abe, // XK_rightanglebracket
 | 
			
		||||
    0x3001: 0x04a4, // XK_kana_comma
 | 
			
		||||
    0x3002: 0x04a1, // XK_kana_fullstop
 | 
			
		||||
    0x300c: 0x04a2, // XK_kana_openingbracket
 | 
			
		||||
    0x300d: 0x04a3, // XK_kana_closingbracket
 | 
			
		||||
    0x309b: 0x04de, // XK_voicedsound
 | 
			
		||||
    0x309c: 0x04df, // XK_semivoicedsound
 | 
			
		||||
    0x30a1: 0x04a7, // XK_kana_a
 | 
			
		||||
    0x30a2: 0x04b1, // XK_kana_A
 | 
			
		||||
    0x30a3: 0x04a8, // XK_kana_i
 | 
			
		||||
    0x30a4: 0x04b2, // XK_kana_I
 | 
			
		||||
    0x30a5: 0x04a9, // XK_kana_u
 | 
			
		||||
    0x30a6: 0x04b3, // XK_kana_U
 | 
			
		||||
    0x30a7: 0x04aa, // XK_kana_e
 | 
			
		||||
    0x30a8: 0x04b4, // XK_kana_E
 | 
			
		||||
    0x30a9: 0x04ab, // XK_kana_o
 | 
			
		||||
    0x30aa: 0x04b5, // XK_kana_O
 | 
			
		||||
    0x30ab: 0x04b6, // XK_kana_KA
 | 
			
		||||
    0x30ad: 0x04b7, // XK_kana_KI
 | 
			
		||||
    0x30af: 0x04b8, // XK_kana_KU
 | 
			
		||||
    0x30b1: 0x04b9, // XK_kana_KE
 | 
			
		||||
    0x30b3: 0x04ba, // XK_kana_KO
 | 
			
		||||
    0x30b5: 0x04bb, // XK_kana_SA
 | 
			
		||||
    0x30b7: 0x04bc, // XK_kana_SHI
 | 
			
		||||
    0x30b9: 0x04bd, // XK_kana_SU
 | 
			
		||||
    0x30bb: 0x04be, // XK_kana_SE
 | 
			
		||||
    0x30bd: 0x04bf, // XK_kana_SO
 | 
			
		||||
    0x30bf: 0x04c0, // XK_kana_TA
 | 
			
		||||
    0x30c1: 0x04c1, // XK_kana_CHI
 | 
			
		||||
    0x30c3: 0x04af, // XK_kana_tsu
 | 
			
		||||
    0x30c4: 0x04c2, // XK_kana_TSU
 | 
			
		||||
    0x30c6: 0x04c3, // XK_kana_TE
 | 
			
		||||
    0x30c8: 0x04c4, // XK_kana_TO
 | 
			
		||||
    0x30ca: 0x04c5, // XK_kana_NA
 | 
			
		||||
    0x30cb: 0x04c6, // XK_kana_NI
 | 
			
		||||
    0x30cc: 0x04c7, // XK_kana_NU
 | 
			
		||||
    0x30cd: 0x04c8, // XK_kana_NE
 | 
			
		||||
    0x30ce: 0x04c9, // XK_kana_NO
 | 
			
		||||
    0x30cf: 0x04ca, // XK_kana_HA
 | 
			
		||||
    0x30d2: 0x04cb, // XK_kana_HI
 | 
			
		||||
    0x30d5: 0x04cc, // XK_kana_FU
 | 
			
		||||
    0x30d8: 0x04cd, // XK_kana_HE
 | 
			
		||||
    0x30db: 0x04ce, // XK_kana_HO
 | 
			
		||||
    0x30de: 0x04cf, // XK_kana_MA
 | 
			
		||||
    0x30df: 0x04d0, // XK_kana_MI
 | 
			
		||||
    0x30e0: 0x04d1, // XK_kana_MU
 | 
			
		||||
    0x30e1: 0x04d2, // XK_kana_ME
 | 
			
		||||
    0x30e2: 0x04d3, // XK_kana_MO
 | 
			
		||||
    0x30e3: 0x04ac, // XK_kana_ya
 | 
			
		||||
    0x30e4: 0x04d4, // XK_kana_YA
 | 
			
		||||
    0x30e5: 0x04ad, // XK_kana_yu
 | 
			
		||||
    0x30e6: 0x04d5, // XK_kana_YU
 | 
			
		||||
    0x30e7: 0x04ae, // XK_kana_yo
 | 
			
		||||
    0x30e8: 0x04d6, // XK_kana_YO
 | 
			
		||||
    0x30e9: 0x04d7, // XK_kana_RA
 | 
			
		||||
    0x30ea: 0x04d8, // XK_kana_RI
 | 
			
		||||
    0x30eb: 0x04d9, // XK_kana_RU
 | 
			
		||||
    0x30ec: 0x04da, // XK_kana_RE
 | 
			
		||||
    0x30ed: 0x04db, // XK_kana_RO
 | 
			
		||||
    0x30ef: 0x04dc, // XK_kana_WA
 | 
			
		||||
    0x30f2: 0x04a6, // XK_kana_WO
 | 
			
		||||
    0x30f3: 0x04dd, // XK_kana_N
 | 
			
		||||
    0x30fb: 0x04a5, // XK_kana_conjunctive
 | 
			
		||||
    0x30fc: 0x04b0 // XK_prolongedsound
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.default = {
 | 
			
		||||
    lookup: function (u) {
 | 
			
		||||
        // Latin-1 is one-to-one mapping
 | 
			
		||||
        if (u >= 0x20 && u <= 0xff) {
 | 
			
		||||
            return u;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Lookup table (fairly random)
 | 
			
		||||
        var keysym = codepoints[u];
 | 
			
		||||
        if (keysym !== undefined) {
 | 
			
		||||
            return keysym;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // General mapping as final fallback
 | 
			
		||||
        return 0x01000000 | u;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										288
									
								
								static/js/novnc/core/input/mouse.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,288 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.default = Mouse;
 | 
			
		||||
 | 
			
		||||
var _logging = require('../util/logging.js');
 | 
			
		||||
 | 
			
		||||
var Log = _interopRequireWildcard(_logging);
 | 
			
		||||
 | 
			
		||||
var _browser = require('../util/browser.js');
 | 
			
		||||
 | 
			
		||||
var _events = require('../util/events.js');
 | 
			
		||||
 | 
			
		||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 | 
			
		||||
 | 
			
		||||
var WHEEL_STEP = 10; // Delta threshold for a mouse wheel step
 | 
			
		||||
/*
 | 
			
		||||
 * 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)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
var WHEEL_STEP_TIMEOUT = 50; // ms
 | 
			
		||||
var WHEEL_LINE_HEIGHT = 19;
 | 
			
		||||
 | 
			
		||||
function Mouse(target) {
 | 
			
		||||
    this._target = target || document;
 | 
			
		||||
 | 
			
		||||
    this._doubleClickTimer = null;
 | 
			
		||||
    this._lastTouchPos = null;
 | 
			
		||||
 | 
			
		||||
    this._pos = null;
 | 
			
		||||
    this._wheelStepXTimer = null;
 | 
			
		||||
    this._wheelStepYTimer = null;
 | 
			
		||||
    this._accumulatedWheelDeltaX = 0;
 | 
			
		||||
    this._accumulatedWheelDeltaY = 0;
 | 
			
		||||
 | 
			
		||||
    this._eventHandlers = {
 | 
			
		||||
        'mousedown': this._handleMouseDown.bind(this),
 | 
			
		||||
        'mouseup': this._handleMouseUp.bind(this),
 | 
			
		||||
        'mousemove': this._handleMouseMove.bind(this),
 | 
			
		||||
        'mousewheel': this._handleMouseWheel.bind(this),
 | 
			
		||||
        'mousedisable': this._handleMouseDisable.bind(this)
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Mouse.prototype = {
 | 
			
		||||
    // ===== PROPERTIES =====
 | 
			
		||||
 | 
			
		||||
    touchButton: 1, // Button mask (1, 2, 4) for touch devices (0 means ignore clicks)
 | 
			
		||||
 | 
			
		||||
    // ===== EVENT HANDLERS =====
 | 
			
		||||
 | 
			
		||||
    onmousebutton: function () {}, // Handler for mouse button click/release
 | 
			
		||||
    onmousemove: function () {}, // Handler for mouse movement
 | 
			
		||||
 | 
			
		||||
    // ===== PRIVATE METHODS =====
 | 
			
		||||
 | 
			
		||||
    _resetDoubleClickTimer: function () {
 | 
			
		||||
        this._doubleClickTimer = null;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleMouseButton: function (e, down) {
 | 
			
		||||
        this._updateMousePosition(e);
 | 
			
		||||
        var pos = this._pos;
 | 
			
		||||
 | 
			
		||||
        var bmask;
 | 
			
		||||
        if (e.touches || e.changedTouches) {
 | 
			
		||||
            // Touch device
 | 
			
		||||
 | 
			
		||||
            // When two touches occur within 500 ms of each other and are
 | 
			
		||||
            // close enough together a double click is triggered.
 | 
			
		||||
            if (down == 1) {
 | 
			
		||||
                if (this._doubleClickTimer === null) {
 | 
			
		||||
                    this._lastTouchPos = pos;
 | 
			
		||||
                } else {
 | 
			
		||||
                    clearTimeout(this._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 = this._lastTouchPos.x - pos.x;
 | 
			
		||||
                    var ys = this._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.
 | 
			
		||||
                    var threshold = 20 * (window.devicePixelRatio || 1);
 | 
			
		||||
                    if (d < threshold) {
 | 
			
		||||
                        pos = this._lastTouchPos;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                this._doubleClickTimer = setTimeout(this._resetDoubleClickTimer.bind(this), 500);
 | 
			
		||||
            }
 | 
			
		||||
            bmask = this.touchButton;
 | 
			
		||||
            // If bmask is set
 | 
			
		||||
        } else if (e.which) {
 | 
			
		||||
            /* everything except IE */
 | 
			
		||||
            bmask = 1 << e.button;
 | 
			
		||||
        } else {
 | 
			
		||||
            /* IE including 9 */
 | 
			
		||||
            bmask = (e.button & 0x1) + // Left
 | 
			
		||||
            (e.button & 0x2) * 2 + // Right
 | 
			
		||||
            (e.button & 0x4) / 2; // Middle
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Log.Debug("onmousebutton " + (down ? "down" : "up") + ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask);
 | 
			
		||||
        this.onmousebutton(pos.x, pos.y, down, bmask);
 | 
			
		||||
 | 
			
		||||
        (0, _events.stopEvent)(e);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleMouseDown: function (e) {
 | 
			
		||||
        // Touch events have implicit capture
 | 
			
		||||
        if (e.type === "mousedown") {
 | 
			
		||||
            (0, _events.setCapture)(this._target);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._handleMouseButton(e, 1);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleMouseUp: function (e) {
 | 
			
		||||
        this._handleMouseButton(e, 0);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Mouse wheel events are sent in steps over VNC. This means that the VNC
 | 
			
		||||
    // protocol can't handle a wheel event with specific distance or speed.
 | 
			
		||||
    // Therefor, if we get a lot of small mouse wheel events we combine them.
 | 
			
		||||
    _generateWheelStepX: function () {
 | 
			
		||||
 | 
			
		||||
        if (this._accumulatedWheelDeltaX < 0) {
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 5);
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 5);
 | 
			
		||||
        } else if (this._accumulatedWheelDeltaX > 0) {
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 6);
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 6);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._accumulatedWheelDeltaX = 0;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _generateWheelStepY: function () {
 | 
			
		||||
 | 
			
		||||
        if (this._accumulatedWheelDeltaY < 0) {
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 3);
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 3);
 | 
			
		||||
        } else if (this._accumulatedWheelDeltaY > 0) {
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 4);
 | 
			
		||||
            this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 4);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._accumulatedWheelDeltaY = 0;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _resetWheelStepTimers: function () {
 | 
			
		||||
        window.clearTimeout(this._wheelStepXTimer);
 | 
			
		||||
        window.clearTimeout(this._wheelStepYTimer);
 | 
			
		||||
        this._wheelStepXTimer = null;
 | 
			
		||||
        this._wheelStepYTimer = null;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleMouseWheel: function (e) {
 | 
			
		||||
        this._resetWheelStepTimers();
 | 
			
		||||
 | 
			
		||||
        this._updateMousePosition(e);
 | 
			
		||||
 | 
			
		||||
        var dX = e.deltaX;
 | 
			
		||||
        var dY = e.deltaY;
 | 
			
		||||
 | 
			
		||||
        // Pixel units unless it's non-zero.
 | 
			
		||||
        // Note that if deltamode is line or page won't matter since we aren't
 | 
			
		||||
        // sending the mouse wheel delta to the server anyway.
 | 
			
		||||
        // The difference between pixel and line can be important however since
 | 
			
		||||
        // we have a threshold that can be smaller than the line height.
 | 
			
		||||
        if (e.deltaMode !== 0) {
 | 
			
		||||
            dX *= WHEEL_LINE_HEIGHT;
 | 
			
		||||
            dY *= WHEEL_LINE_HEIGHT;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._accumulatedWheelDeltaX += dX;
 | 
			
		||||
        this._accumulatedWheelDeltaY += dY;
 | 
			
		||||
 | 
			
		||||
        // Generate a mouse wheel step event when the accumulated delta
 | 
			
		||||
        // for one of the axes is large enough.
 | 
			
		||||
        // Small delta events that do not pass the threshold get sent
 | 
			
		||||
        // after a timeout.
 | 
			
		||||
        if (Math.abs(this._accumulatedWheelDeltaX) > WHEEL_STEP) {
 | 
			
		||||
            this._generateWheelStepX();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._wheelStepXTimer = window.setTimeout(this._generateWheelStepX.bind(this), WHEEL_STEP_TIMEOUT);
 | 
			
		||||
        }
 | 
			
		||||
        if (Math.abs(this._accumulatedWheelDeltaY) > WHEEL_STEP) {
 | 
			
		||||
            this._generateWheelStepY();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._wheelStepYTimer = window.setTimeout(this._generateWheelStepY.bind(this), WHEEL_STEP_TIMEOUT);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        (0, _events.stopEvent)(e);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleMouseMove: function (e) {
 | 
			
		||||
        this._updateMousePosition(e);
 | 
			
		||||
        this.onmousemove(this._pos.x, this._pos.y);
 | 
			
		||||
        (0, _events.stopEvent)(e);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _handleMouseDisable: function (e) {
 | 
			
		||||
        /*
 | 
			
		||||
         * Stop propagation if inside canvas area
 | 
			
		||||
         * Note: This is only needed for the 'click' event as it fails
 | 
			
		||||
         *       to fire properly for the target element so we have
 | 
			
		||||
         *       to listen on the document element instead.
 | 
			
		||||
         */
 | 
			
		||||
        if (e.target == this._target) {
 | 
			
		||||
            (0, _events.stopEvent)(e);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Update coordinates relative to target
 | 
			
		||||
    _updateMousePosition: function (e) {
 | 
			
		||||
        e = (0, _events.getPointerEvent)(e);
 | 
			
		||||
        var bounds = this._target.getBoundingClientRect();
 | 
			
		||||
        var x, y;
 | 
			
		||||
        // Clip to target bounds
 | 
			
		||||
        if (e.clientX < bounds.left) {
 | 
			
		||||
            x = 0;
 | 
			
		||||
        } else if (e.clientX >= bounds.right) {
 | 
			
		||||
            x = bounds.width - 1;
 | 
			
		||||
        } else {
 | 
			
		||||
            x = e.clientX - bounds.left;
 | 
			
		||||
        }
 | 
			
		||||
        if (e.clientY < bounds.top) {
 | 
			
		||||
            y = 0;
 | 
			
		||||
        } else if (e.clientY >= bounds.bottom) {
 | 
			
		||||
            y = bounds.height - 1;
 | 
			
		||||
        } else {
 | 
			
		||||
            y = e.clientY - bounds.top;
 | 
			
		||||
        }
 | 
			
		||||
        this._pos = { x: x, y: y };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // ===== PUBLIC METHODS =====
 | 
			
		||||
 | 
			
		||||
    grab: function () {
 | 
			
		||||
        var c = this._target;
 | 
			
		||||
 | 
			
		||||
        if (_browser.isTouchDevice) {
 | 
			
		||||
            c.addEventListener('touchstart', this._eventHandlers.mousedown);
 | 
			
		||||
            c.addEventListener('touchend', this._eventHandlers.mouseup);
 | 
			
		||||
            c.addEventListener('touchmove', this._eventHandlers.mousemove);
 | 
			
		||||
        }
 | 
			
		||||
        c.addEventListener('mousedown', this._eventHandlers.mousedown);
 | 
			
		||||
        c.addEventListener('mouseup', this._eventHandlers.mouseup);
 | 
			
		||||
        c.addEventListener('mousemove', this._eventHandlers.mousemove);
 | 
			
		||||
        c.addEventListener('wheel', this._eventHandlers.mousewheel);
 | 
			
		||||
 | 
			
		||||
        /* Prevent middle-click pasting (see above for why we bind to document) */
 | 
			
		||||
        document.addEventListener('click', this._eventHandlers.mousedisable);
 | 
			
		||||
 | 
			
		||||
        /* preventDefault() on mousedown doesn't stop this event for some
 | 
			
		||||
           reason so we have to explicitly block it */
 | 
			
		||||
        c.addEventListener('contextmenu', this._eventHandlers.mousedisable);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    ungrab: function () {
 | 
			
		||||
        var c = this._target;
 | 
			
		||||
 | 
			
		||||
        this._resetWheelStepTimers();
 | 
			
		||||
 | 
			
		||||
        if (_browser.isTouchDevice) {
 | 
			
		||||
            c.removeEventListener('touchstart', this._eventHandlers.mousedown);
 | 
			
		||||
            c.removeEventListener('touchend', this._eventHandlers.mouseup);
 | 
			
		||||
            c.removeEventListener('touchmove', this._eventHandlers.mousemove);
 | 
			
		||||
        }
 | 
			
		||||
        c.removeEventListener('mousedown', this._eventHandlers.mousedown);
 | 
			
		||||
        c.removeEventListener('mouseup', this._eventHandlers.mouseup);
 | 
			
		||||
        c.removeEventListener('mousemove', this._eventHandlers.mousemove);
 | 
			
		||||
        c.removeEventListener('wheel', this._eventHandlers.mousewheel);
 | 
			
		||||
 | 
			
		||||
        document.removeEventListener('click', this._eventHandlers.mousedisable);
 | 
			
		||||
 | 
			
		||||
        c.removeEventListener('contextmenu', this._eventHandlers.mousedisable);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										234
									
								
								static/js/novnc/core/input/util.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,234 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.getKeycode = getKeycode;
 | 
			
		||||
exports.getKey = getKey;
 | 
			
		||||
exports.getKeysym = getKeysym;
 | 
			
		||||
 | 
			
		||||
var _keysym = require("./keysym.js");
 | 
			
		||||
 | 
			
		||||
var _keysym2 = _interopRequireDefault(_keysym);
 | 
			
		||||
 | 
			
		||||
var _keysymdef = require("./keysymdef.js");
 | 
			
		||||
 | 
			
		||||
var _keysymdef2 = _interopRequireDefault(_keysymdef);
 | 
			
		||||
 | 
			
		||||
var _vkeys = require("./vkeys.js");
 | 
			
		||||
 | 
			
		||||
var _vkeys2 = _interopRequireDefault(_vkeys);
 | 
			
		||||
 | 
			
		||||
var _fixedkeys = require("./fixedkeys.js");
 | 
			
		||||
 | 
			
		||||
var _fixedkeys2 = _interopRequireDefault(_fixedkeys);
 | 
			
		||||
 | 
			
		||||
var _domkeytable = require("./domkeytable.js");
 | 
			
		||||
 | 
			
		||||
var _domkeytable2 = _interopRequireDefault(_domkeytable);
 | 
			
		||||
 | 
			
		||||
var _browser = require("../util/browser.js");
 | 
			
		||||
 | 
			
		||||
var browser = _interopRequireWildcard(_browser);
 | 
			
		||||
 | 
			
		||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 | 
			
		||||
 | 
			
		||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
			
		||||
 | 
			
		||||
// Get 'KeyboardEvent.code', handling legacy browsers
 | 
			
		||||
function getKeycode(evt) {
 | 
			
		||||
    // Are we getting proper key identifiers?
 | 
			
		||||
    // (unfortunately Firefox and Chrome are crappy here and gives
 | 
			
		||||
    // us an empty string on some platforms, rather than leaving it
 | 
			
		||||
    // undefined)
 | 
			
		||||
    if (evt.code) {
 | 
			
		||||
        // Mozilla isn't fully in sync with the spec yet
 | 
			
		||||
        switch (evt.code) {
 | 
			
		||||
            case 'OSLeft':
 | 
			
		||||
                return 'MetaLeft';
 | 
			
		||||
            case 'OSRight':
 | 
			
		||||
                return 'MetaRight';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return evt.code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // The de-facto standard is to use Windows Virtual-Key codes
 | 
			
		||||
    // in the 'keyCode' field for non-printable characters. However
 | 
			
		||||
    // Webkit sets it to the same as charCode in 'keypress' events.
 | 
			
		||||
    if (evt.type !== 'keypress' && evt.keyCode in _vkeys2.default) {
 | 
			
		||||
        var code = _vkeys2.default[evt.keyCode];
 | 
			
		||||
 | 
			
		||||
        // macOS has messed up this code for some reason
 | 
			
		||||
        if (browser.isMac() && code === 'ContextMenu') {
 | 
			
		||||
            code = 'MetaRight';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // The keyCode doesn't distinguish between left and right
 | 
			
		||||
        // for the standard modifiers
 | 
			
		||||
        if (evt.location === 2) {
 | 
			
		||||
            switch (code) {
 | 
			
		||||
                case 'ShiftLeft':
 | 
			
		||||
                    return 'ShiftRight';
 | 
			
		||||
                case 'ControlLeft':
 | 
			
		||||
                    return 'ControlRight';
 | 
			
		||||
                case 'AltLeft':
 | 
			
		||||
                    return 'AltRight';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Nor a bunch of the numpad keys
 | 
			
		||||
        if (evt.location === 3) {
 | 
			
		||||
            switch (code) {
 | 
			
		||||
                case 'Delete':
 | 
			
		||||
                    return 'NumpadDecimal';
 | 
			
		||||
                case 'Insert':
 | 
			
		||||
                    return 'Numpad0';
 | 
			
		||||
                case 'End':
 | 
			
		||||
                    return 'Numpad1';
 | 
			
		||||
                case 'ArrowDown':
 | 
			
		||||
                    return 'Numpad2';
 | 
			
		||||
                case 'PageDown':
 | 
			
		||||
                    return 'Numpad3';
 | 
			
		||||
                case 'ArrowLeft':
 | 
			
		||||
                    return 'Numpad4';
 | 
			
		||||
                case 'ArrowRight':
 | 
			
		||||
                    return 'Numpad6';
 | 
			
		||||
                case 'Home':
 | 
			
		||||
                    return 'Numpad7';
 | 
			
		||||
                case 'ArrowUp':
 | 
			
		||||
                    return 'Numpad8';
 | 
			
		||||
                case 'PageUp':
 | 
			
		||||
                    return 'Numpad9';
 | 
			
		||||
                case 'Enter':
 | 
			
		||||
                    return 'NumpadEnter';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return code;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'Unidentified';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get 'KeyboardEvent.key', handling legacy browsers
 | 
			
		||||
function getKey(evt) {
 | 
			
		||||
    // Are we getting a proper key value?
 | 
			
		||||
    if (evt.key !== undefined) {
 | 
			
		||||
        // IE and Edge use some ancient version of the spec
 | 
			
		||||
        // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
 | 
			
		||||
        switch (evt.key) {
 | 
			
		||||
            case 'Spacebar':
 | 
			
		||||
                return ' ';
 | 
			
		||||
            case 'Esc':
 | 
			
		||||
                return 'Escape';
 | 
			
		||||
            case 'Scroll':
 | 
			
		||||
                return 'ScrollLock';
 | 
			
		||||
            case 'Win':
 | 
			
		||||
                return 'Meta';
 | 
			
		||||
            case 'Apps':
 | 
			
		||||
                return 'ContextMenu';
 | 
			
		||||
            case 'Up':
 | 
			
		||||
                return 'ArrowUp';
 | 
			
		||||
            case 'Left':
 | 
			
		||||
                return 'ArrowLeft';
 | 
			
		||||
            case 'Right':
 | 
			
		||||
                return 'ArrowRight';
 | 
			
		||||
            case 'Down':
 | 
			
		||||
                return 'ArrowDown';
 | 
			
		||||
            case 'Del':
 | 
			
		||||
                return 'Delete';
 | 
			
		||||
            case 'Divide':
 | 
			
		||||
                return '/';
 | 
			
		||||
            case 'Multiply':
 | 
			
		||||
                return '*';
 | 
			
		||||
            case 'Subtract':
 | 
			
		||||
                return '-';
 | 
			
		||||
            case 'Add':
 | 
			
		||||
                return '+';
 | 
			
		||||
            case 'Decimal':
 | 
			
		||||
                return evt.char;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Mozilla isn't fully in sync with the spec yet
 | 
			
		||||
        switch (evt.key) {
 | 
			
		||||
            case 'OS':
 | 
			
		||||
                return 'Meta';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // iOS leaks some OS names
 | 
			
		||||
        switch (evt.key) {
 | 
			
		||||
            case 'UIKeyInputUpArrow':
 | 
			
		||||
                return 'ArrowUp';
 | 
			
		||||
            case 'UIKeyInputDownArrow':
 | 
			
		||||
                return 'ArrowDown';
 | 
			
		||||
            case 'UIKeyInputLeftArrow':
 | 
			
		||||
                return 'ArrowLeft';
 | 
			
		||||
            case 'UIKeyInputRightArrow':
 | 
			
		||||
                return 'ArrowRight';
 | 
			
		||||
            case 'UIKeyInputEscape':
 | 
			
		||||
                return 'Escape';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // IE and Edge have broken handling of AltGraph so we cannot
 | 
			
		||||
        // trust them for printable characters
 | 
			
		||||
        if (evt.key.length !== 1 || !browser.isIE() && !browser.isEdge()) {
 | 
			
		||||
            return evt.key;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Try to deduce it based on the physical key
 | 
			
		||||
    var code = getKeycode(evt);
 | 
			
		||||
    if (code in _fixedkeys2.default) {
 | 
			
		||||
        return _fixedkeys2.default[code];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // If that failed, then see if we have a printable character
 | 
			
		||||
    if (evt.charCode) {
 | 
			
		||||
        return String.fromCharCode(evt.charCode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // At this point we have nothing left to go on
 | 
			
		||||
    return 'Unidentified';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get the most reliable keysym value we can get from a key event
 | 
			
		||||
function getKeysym(evt) {
 | 
			
		||||
    var key = getKey(evt);
 | 
			
		||||
 | 
			
		||||
    if (key === 'Unidentified') {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // First look up special keys
 | 
			
		||||
    if (key in _domkeytable2.default) {
 | 
			
		||||
        var location = evt.location;
 | 
			
		||||
 | 
			
		||||
        // Safari screws up location for the right cmd key
 | 
			
		||||
        if (key === 'Meta' && location === 0) {
 | 
			
		||||
            location = 2;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (location === undefined || location > 3) {
 | 
			
		||||
            location = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return _domkeytable2.default[key][location];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Now we need to look at the Unicode symbol instead
 | 
			
		||||
 | 
			
		||||
    var codepoint;
 | 
			
		||||
 | 
			
		||||
    // Special key? (FIXME: Should have been caught earlier)
 | 
			
		||||
    if (key.length !== 1) {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    codepoint = key.charCodeAt();
 | 
			
		||||
    if (codepoint) {
 | 
			
		||||
        return _keysymdef2.default.lookup(codepoint);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return null;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										121
									
								
								static/js/novnc/core/input/vkeys.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,121 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
  value: true
 | 
			
		||||
});
 | 
			
		||||
/*
 | 
			
		||||
 * noVNC: HTML5 VNC client
 | 
			
		||||
 * Copyright (C) 2017 Pierre Ossman for Cendio AB
 | 
			
		||||
 * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mapping between Microsoft® Windows® Virtual-Key codes and
 | 
			
		||||
 * HTML key codes.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
exports.default = {
 | 
			
		||||
  0x08: 'Backspace',
 | 
			
		||||
  0x09: 'Tab',
 | 
			
		||||
  0x0a: 'NumpadClear',
 | 
			
		||||
  0x0d: 'Enter',
 | 
			
		||||
  0x10: 'ShiftLeft',
 | 
			
		||||
  0x11: 'ControlLeft',
 | 
			
		||||
  0x12: 'AltLeft',
 | 
			
		||||
  0x13: 'Pause',
 | 
			
		||||
  0x14: 'CapsLock',
 | 
			
		||||
  0x15: 'Lang1',
 | 
			
		||||
  0x19: 'Lang2',
 | 
			
		||||
  0x1b: 'Escape',
 | 
			
		||||
  0x1c: 'Convert',
 | 
			
		||||
  0x1d: 'NonConvert',
 | 
			
		||||
  0x20: 'Space',
 | 
			
		||||
  0x21: 'PageUp',
 | 
			
		||||
  0x22: 'PageDown',
 | 
			
		||||
  0x23: 'End',
 | 
			
		||||
  0x24: 'Home',
 | 
			
		||||
  0x25: 'ArrowLeft',
 | 
			
		||||
  0x26: 'ArrowUp',
 | 
			
		||||
  0x27: 'ArrowRight',
 | 
			
		||||
  0x28: 'ArrowDown',
 | 
			
		||||
  0x29: 'Select',
 | 
			
		||||
  0x2c: 'PrintScreen',
 | 
			
		||||
  0x2d: 'Insert',
 | 
			
		||||
  0x2e: 'Delete',
 | 
			
		||||
  0x2f: 'Help',
 | 
			
		||||
  0x30: 'Digit0',
 | 
			
		||||
  0x31: 'Digit1',
 | 
			
		||||
  0x32: 'Digit2',
 | 
			
		||||
  0x33: 'Digit3',
 | 
			
		||||
  0x34: 'Digit4',
 | 
			
		||||
  0x35: 'Digit5',
 | 
			
		||||
  0x36: 'Digit6',
 | 
			
		||||
  0x37: 'Digit7',
 | 
			
		||||
  0x38: 'Digit8',
 | 
			
		||||
  0x39: 'Digit9',
 | 
			
		||||
  0x5b: 'MetaLeft',
 | 
			
		||||
  0x5c: 'MetaRight',
 | 
			
		||||
  0x5d: 'ContextMenu',
 | 
			
		||||
  0x5f: 'Sleep',
 | 
			
		||||
  0x60: 'Numpad0',
 | 
			
		||||
  0x61: 'Numpad1',
 | 
			
		||||
  0x62: 'Numpad2',
 | 
			
		||||
  0x63: 'Numpad3',
 | 
			
		||||
  0x64: 'Numpad4',
 | 
			
		||||
  0x65: 'Numpad5',
 | 
			
		||||
  0x66: 'Numpad6',
 | 
			
		||||
  0x67: 'Numpad7',
 | 
			
		||||
  0x68: 'Numpad8',
 | 
			
		||||
  0x69: 'Numpad9',
 | 
			
		||||
  0x6a: 'NumpadMultiply',
 | 
			
		||||
  0x6b: 'NumpadAdd',
 | 
			
		||||
  0x6c: 'NumpadDecimal',
 | 
			
		||||
  0x6d: 'NumpadSubtract',
 | 
			
		||||
  0x6e: 'NumpadDecimal', // Duplicate, because buggy on Windows
 | 
			
		||||
  0x6f: 'NumpadDivide',
 | 
			
		||||
  0x70: 'F1',
 | 
			
		||||
  0x71: 'F2',
 | 
			
		||||
  0x72: 'F3',
 | 
			
		||||
  0x73: 'F4',
 | 
			
		||||
  0x74: 'F5',
 | 
			
		||||
  0x75: 'F6',
 | 
			
		||||
  0x76: 'F7',
 | 
			
		||||
  0x77: 'F8',
 | 
			
		||||
  0x78: 'F9',
 | 
			
		||||
  0x79: 'F10',
 | 
			
		||||
  0x7a: 'F11',
 | 
			
		||||
  0x7b: 'F12',
 | 
			
		||||
  0x7c: 'F13',
 | 
			
		||||
  0x7d: 'F14',
 | 
			
		||||
  0x7e: 'F15',
 | 
			
		||||
  0x7f: 'F16',
 | 
			
		||||
  0x80: 'F17',
 | 
			
		||||
  0x81: 'F18',
 | 
			
		||||
  0x82: 'F19',
 | 
			
		||||
  0x83: 'F20',
 | 
			
		||||
  0x84: 'F21',
 | 
			
		||||
  0x85: 'F22',
 | 
			
		||||
  0x86: 'F23',
 | 
			
		||||
  0x87: 'F24',
 | 
			
		||||
  0x90: 'NumLock',
 | 
			
		||||
  0x91: 'ScrollLock',
 | 
			
		||||
  0xa6: 'BrowserBack',
 | 
			
		||||
  0xa7: 'BrowserForward',
 | 
			
		||||
  0xa8: 'BrowserRefresh',
 | 
			
		||||
  0xa9: 'BrowserStop',
 | 
			
		||||
  0xaa: 'BrowserSearch',
 | 
			
		||||
  0xab: 'BrowserFavorites',
 | 
			
		||||
  0xac: 'BrowserHome',
 | 
			
		||||
  0xad: 'AudioVolumeMute',
 | 
			
		||||
  0xae: 'AudioVolumeDown',
 | 
			
		||||
  0xaf: 'AudioVolumeUp',
 | 
			
		||||
  0xb0: 'MediaTrackNext',
 | 
			
		||||
  0xb1: 'MediaTrackPrevious',
 | 
			
		||||
  0xb2: 'MediaStop',
 | 
			
		||||
  0xb3: 'MediaPlayPause',
 | 
			
		||||
  0xb4: 'LaunchMail',
 | 
			
		||||
  0xb5: 'MediaSelect',
 | 
			
		||||
  0xb6: 'LaunchApp1',
 | 
			
		||||
  0xb7: 'LaunchApp2',
 | 
			
		||||
  0xe1: 'AltRight' // Only when it is AltGraph
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										176
									
								
								static/js/novnc/core/input/xtscancodes.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,176 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
  value: true
 | 
			
		||||
});
 | 
			
		||||
/*
 | 
			
		||||
 * This file is auto-generated from keymaps.csv on 2017-05-31 16:20
 | 
			
		||||
 * Database checksum sha256(92fd165507f2a3b8c5b3fa56e425d45788dbcb98cf067a307527d91ce22cab94)
 | 
			
		||||
 * To re-generate, run:
 | 
			
		||||
 *   keymap-gen --lang=js code-map keymaps.csv html atset1
 | 
			
		||||
*/
 | 
			
		||||
exports.default = {
 | 
			
		||||
  "Again": 0xe005, /* html:Again (Again) -> linux:129 (KEY_AGAIN) -> atset1:57349 */
 | 
			
		||||
  "AltLeft": 0x38, /* html:AltLeft (AltLeft) -> linux:56 (KEY_LEFTALT) -> atset1:56 */
 | 
			
		||||
  "AltRight": 0xe038, /* html:AltRight (AltRight) -> linux:100 (KEY_RIGHTALT) -> atset1:57400 */
 | 
			
		||||
  "ArrowDown": 0xe050, /* html:ArrowDown (ArrowDown) -> linux:108 (KEY_DOWN) -> atset1:57424 */
 | 
			
		||||
  "ArrowLeft": 0xe04b, /* html:ArrowLeft (ArrowLeft) -> linux:105 (KEY_LEFT) -> atset1:57419 */
 | 
			
		||||
  "ArrowRight": 0xe04d, /* html:ArrowRight (ArrowRight) -> linux:106 (KEY_RIGHT) -> atset1:57421 */
 | 
			
		||||
  "ArrowUp": 0xe048, /* html:ArrowUp (ArrowUp) -> linux:103 (KEY_UP) -> atset1:57416 */
 | 
			
		||||
  "AudioVolumeDown": 0xe02e, /* html:AudioVolumeDown (AudioVolumeDown) -> linux:114 (KEY_VOLUMEDOWN) -> atset1:57390 */
 | 
			
		||||
  "AudioVolumeMute": 0xe020, /* html:AudioVolumeMute (AudioVolumeMute) -> linux:113 (KEY_MUTE) -> atset1:57376 */
 | 
			
		||||
  "AudioVolumeUp": 0xe030, /* html:AudioVolumeUp (AudioVolumeUp) -> linux:115 (KEY_VOLUMEUP) -> atset1:57392 */
 | 
			
		||||
  "Backquote": 0x29, /* html:Backquote (Backquote) -> linux:41 (KEY_GRAVE) -> atset1:41 */
 | 
			
		||||
  "Backslash": 0x2b, /* html:Backslash (Backslash) -> linux:43 (KEY_BACKSLASH) -> atset1:43 */
 | 
			
		||||
  "Backspace": 0xe, /* html:Backspace (Backspace) -> linux:14 (KEY_BACKSPACE) -> atset1:14 */
 | 
			
		||||
  "BracketLeft": 0x1a, /* html:BracketLeft (BracketLeft) -> linux:26 (KEY_LEFTBRACE) -> atset1:26 */
 | 
			
		||||
  "BracketRight": 0x1b, /* html:BracketRight (BracketRight) -> linux:27 (KEY_RIGHTBRACE) -> atset1:27 */
 | 
			
		||||
  "BrowserBack": 0xe06a, /* html:BrowserBack (BrowserBack) -> linux:158 (KEY_BACK) -> atset1:57450 */
 | 
			
		||||
  "BrowserFavorites": 0xe066, /* html:BrowserFavorites (BrowserFavorites) -> linux:156 (KEY_BOOKMARKS) -> atset1:57446 */
 | 
			
		||||
  "BrowserForward": 0xe069, /* html:BrowserForward (BrowserForward) -> linux:159 (KEY_FORWARD) -> atset1:57449 */
 | 
			
		||||
  "BrowserHome": 0xe032, /* html:BrowserHome (BrowserHome) -> linux:172 (KEY_HOMEPAGE) -> atset1:57394 */
 | 
			
		||||
  "BrowserRefresh": 0xe067, /* html:BrowserRefresh (BrowserRefresh) -> linux:173 (KEY_REFRESH) -> atset1:57447 */
 | 
			
		||||
  "BrowserSearch": 0xe065, /* html:BrowserSearch (BrowserSearch) -> linux:217 (KEY_SEARCH) -> atset1:57445 */
 | 
			
		||||
  "BrowserStop": 0xe068, /* html:BrowserStop (BrowserStop) -> linux:128 (KEY_STOP) -> atset1:57448 */
 | 
			
		||||
  "CapsLock": 0x3a, /* html:CapsLock (CapsLock) -> linux:58 (KEY_CAPSLOCK) -> atset1:58 */
 | 
			
		||||
  "Comma": 0x33, /* html:Comma (Comma) -> linux:51 (KEY_COMMA) -> atset1:51 */
 | 
			
		||||
  "ContextMenu": 0xe05d, /* html:ContextMenu (ContextMenu) -> linux:127 (KEY_COMPOSE) -> atset1:57437 */
 | 
			
		||||
  "ControlLeft": 0x1d, /* html:ControlLeft (ControlLeft) -> linux:29 (KEY_LEFTCTRL) -> atset1:29 */
 | 
			
		||||
  "ControlRight": 0xe01d, /* html:ControlRight (ControlRight) -> linux:97 (KEY_RIGHTCTRL) -> atset1:57373 */
 | 
			
		||||
  "Convert": 0x79, /* html:Convert (Convert) -> linux:92 (KEY_HENKAN) -> atset1:121 */
 | 
			
		||||
  "Copy": 0xe078, /* html:Copy (Copy) -> linux:133 (KEY_COPY) -> atset1:57464 */
 | 
			
		||||
  "Cut": 0xe03c, /* html:Cut (Cut) -> linux:137 (KEY_CUT) -> atset1:57404 */
 | 
			
		||||
  "Delete": 0xe053, /* html:Delete (Delete) -> linux:111 (KEY_DELETE) -> atset1:57427 */
 | 
			
		||||
  "Digit0": 0xb, /* html:Digit0 (Digit0) -> linux:11 (KEY_0) -> atset1:11 */
 | 
			
		||||
  "Digit1": 0x2, /* html:Digit1 (Digit1) -> linux:2 (KEY_1) -> atset1:2 */
 | 
			
		||||
  "Digit2": 0x3, /* html:Digit2 (Digit2) -> linux:3 (KEY_2) -> atset1:3 */
 | 
			
		||||
  "Digit3": 0x4, /* html:Digit3 (Digit3) -> linux:4 (KEY_3) -> atset1:4 */
 | 
			
		||||
  "Digit4": 0x5, /* html:Digit4 (Digit4) -> linux:5 (KEY_4) -> atset1:5 */
 | 
			
		||||
  "Digit5": 0x6, /* html:Digit5 (Digit5) -> linux:6 (KEY_5) -> atset1:6 */
 | 
			
		||||
  "Digit6": 0x7, /* html:Digit6 (Digit6) -> linux:7 (KEY_6) -> atset1:7 */
 | 
			
		||||
  "Digit7": 0x8, /* html:Digit7 (Digit7) -> linux:8 (KEY_7) -> atset1:8 */
 | 
			
		||||
  "Digit8": 0x9, /* html:Digit8 (Digit8) -> linux:9 (KEY_8) -> atset1:9 */
 | 
			
		||||
  "Digit9": 0xa, /* html:Digit9 (Digit9) -> linux:10 (KEY_9) -> atset1:10 */
 | 
			
		||||
  "Eject": 0xe07d, /* html:Eject (Eject) -> linux:162 (KEY_EJECTCLOSECD) -> atset1:57469 */
 | 
			
		||||
  "End": 0xe04f, /* html:End (End) -> linux:107 (KEY_END) -> atset1:57423 */
 | 
			
		||||
  "Enter": 0x1c, /* html:Enter (Enter) -> linux:28 (KEY_ENTER) -> atset1:28 */
 | 
			
		||||
  "Equal": 0xd, /* html:Equal (Equal) -> linux:13 (KEY_EQUAL) -> atset1:13 */
 | 
			
		||||
  "Escape": 0x1, /* html:Escape (Escape) -> linux:1 (KEY_ESC) -> atset1:1 */
 | 
			
		||||
  "F1": 0x3b, /* html:F1 (F1) -> linux:59 (KEY_F1) -> atset1:59 */
 | 
			
		||||
  "F10": 0x44, /* html:F10 (F10) -> linux:68 (KEY_F10) -> atset1:68 */
 | 
			
		||||
  "F11": 0x57, /* html:F11 (F11) -> linux:87 (KEY_F11) -> atset1:87 */
 | 
			
		||||
  "F12": 0x58, /* html:F12 (F12) -> linux:88 (KEY_F12) -> atset1:88 */
 | 
			
		||||
  "F13": 0x5d, /* html:F13 (F13) -> linux:183 (KEY_F13) -> atset1:93 */
 | 
			
		||||
  "F14": 0x5e, /* html:F14 (F14) -> linux:184 (KEY_F14) -> atset1:94 */
 | 
			
		||||
  "F15": 0x5f, /* html:F15 (F15) -> linux:185 (KEY_F15) -> atset1:95 */
 | 
			
		||||
  "F16": 0x55, /* html:F16 (F16) -> linux:186 (KEY_F16) -> atset1:85 */
 | 
			
		||||
  "F17": 0xe003, /* html:F17 (F17) -> linux:187 (KEY_F17) -> atset1:57347 */
 | 
			
		||||
  "F18": 0xe077, /* html:F18 (F18) -> linux:188 (KEY_F18) -> atset1:57463 */
 | 
			
		||||
  "F19": 0xe004, /* html:F19 (F19) -> linux:189 (KEY_F19) -> atset1:57348 */
 | 
			
		||||
  "F2": 0x3c, /* html:F2 (F2) -> linux:60 (KEY_F2) -> atset1:60 */
 | 
			
		||||
  "F20": 0x5a, /* html:F20 (F20) -> linux:190 (KEY_F20) -> atset1:90 */
 | 
			
		||||
  "F21": 0x74, /* html:F21 (F21) -> linux:191 (KEY_F21) -> atset1:116 */
 | 
			
		||||
  "F22": 0xe079, /* html:F22 (F22) -> linux:192 (KEY_F22) -> atset1:57465 */
 | 
			
		||||
  "F23": 0x6d, /* html:F23 (F23) -> linux:193 (KEY_F23) -> atset1:109 */
 | 
			
		||||
  "F24": 0x6f, /* html:F24 (F24) -> linux:194 (KEY_F24) -> atset1:111 */
 | 
			
		||||
  "F3": 0x3d, /* html:F3 (F3) -> linux:61 (KEY_F3) -> atset1:61 */
 | 
			
		||||
  "F4": 0x3e, /* html:F4 (F4) -> linux:62 (KEY_F4) -> atset1:62 */
 | 
			
		||||
  "F5": 0x3f, /* html:F5 (F5) -> linux:63 (KEY_F5) -> atset1:63 */
 | 
			
		||||
  "F6": 0x40, /* html:F6 (F6) -> linux:64 (KEY_F6) -> atset1:64 */
 | 
			
		||||
  "F7": 0x41, /* html:F7 (F7) -> linux:65 (KEY_F7) -> atset1:65 */
 | 
			
		||||
  "F8": 0x42, /* html:F8 (F8) -> linux:66 (KEY_F8) -> atset1:66 */
 | 
			
		||||
  "F9": 0x43, /* html:F9 (F9) -> linux:67 (KEY_F9) -> atset1:67 */
 | 
			
		||||
  "Find": 0xe041, /* html:Find (Find) -> linux:136 (KEY_FIND) -> atset1:57409 */
 | 
			
		||||
  "Help": 0xe075, /* html:Help (Help) -> linux:138 (KEY_HELP) -> atset1:57461 */
 | 
			
		||||
  "Hiragana": 0x77, /* html:Hiragana (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */
 | 
			
		||||
  "Home": 0xe047, /* html:Home (Home) -> linux:102 (KEY_HOME) -> atset1:57415 */
 | 
			
		||||
  "Insert": 0xe052, /* html:Insert (Insert) -> linux:110 (KEY_INSERT) -> atset1:57426 */
 | 
			
		||||
  "IntlBackslash": 0x56, /* html:IntlBackslash (IntlBackslash) -> linux:86 (KEY_102ND) -> atset1:86 */
 | 
			
		||||
  "IntlRo": 0x73, /* html:IntlRo (IntlRo) -> linux:89 (KEY_RO) -> atset1:115 */
 | 
			
		||||
  "IntlYen": 0x7d, /* html:IntlYen (IntlYen) -> linux:124 (KEY_YEN) -> atset1:125 */
 | 
			
		||||
  "KanaMode": 0x70, /* html:KanaMode (KanaMode) -> linux:93 (KEY_KATAKANAHIRAGANA) -> atset1:112 */
 | 
			
		||||
  "Katakana": 0x78, /* html:Katakana (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */
 | 
			
		||||
  "KeyA": 0x1e, /* html:KeyA (KeyA) -> linux:30 (KEY_A) -> atset1:30 */
 | 
			
		||||
  "KeyB": 0x30, /* html:KeyB (KeyB) -> linux:48 (KEY_B) -> atset1:48 */
 | 
			
		||||
  "KeyC": 0x2e, /* html:KeyC (KeyC) -> linux:46 (KEY_C) -> atset1:46 */
 | 
			
		||||
  "KeyD": 0x20, /* html:KeyD (KeyD) -> linux:32 (KEY_D) -> atset1:32 */
 | 
			
		||||
  "KeyE": 0x12, /* html:KeyE (KeyE) -> linux:18 (KEY_E) -> atset1:18 */
 | 
			
		||||
  "KeyF": 0x21, /* html:KeyF (KeyF) -> linux:33 (KEY_F) -> atset1:33 */
 | 
			
		||||
  "KeyG": 0x22, /* html:KeyG (KeyG) -> linux:34 (KEY_G) -> atset1:34 */
 | 
			
		||||
  "KeyH": 0x23, /* html:KeyH (KeyH) -> linux:35 (KEY_H) -> atset1:35 */
 | 
			
		||||
  "KeyI": 0x17, /* html:KeyI (KeyI) -> linux:23 (KEY_I) -> atset1:23 */
 | 
			
		||||
  "KeyJ": 0x24, /* html:KeyJ (KeyJ) -> linux:36 (KEY_J) -> atset1:36 */
 | 
			
		||||
  "KeyK": 0x25, /* html:KeyK (KeyK) -> linux:37 (KEY_K) -> atset1:37 */
 | 
			
		||||
  "KeyL": 0x26, /* html:KeyL (KeyL) -> linux:38 (KEY_L) -> atset1:38 */
 | 
			
		||||
  "KeyM": 0x32, /* html:KeyM (KeyM) -> linux:50 (KEY_M) -> atset1:50 */
 | 
			
		||||
  "KeyN": 0x31, /* html:KeyN (KeyN) -> linux:49 (KEY_N) -> atset1:49 */
 | 
			
		||||
  "KeyO": 0x18, /* html:KeyO (KeyO) -> linux:24 (KEY_O) -> atset1:24 */
 | 
			
		||||
  "KeyP": 0x19, /* html:KeyP (KeyP) -> linux:25 (KEY_P) -> atset1:25 */
 | 
			
		||||
  "KeyQ": 0x10, /* html:KeyQ (KeyQ) -> linux:16 (KEY_Q) -> atset1:16 */
 | 
			
		||||
  "KeyR": 0x13, /* html:KeyR (KeyR) -> linux:19 (KEY_R) -> atset1:19 */
 | 
			
		||||
  "KeyS": 0x1f, /* html:KeyS (KeyS) -> linux:31 (KEY_S) -> atset1:31 */
 | 
			
		||||
  "KeyT": 0x14, /* html:KeyT (KeyT) -> linux:20 (KEY_T) -> atset1:20 */
 | 
			
		||||
  "KeyU": 0x16, /* html:KeyU (KeyU) -> linux:22 (KEY_U) -> atset1:22 */
 | 
			
		||||
  "KeyV": 0x2f, /* html:KeyV (KeyV) -> linux:47 (KEY_V) -> atset1:47 */
 | 
			
		||||
  "KeyW": 0x11, /* html:KeyW (KeyW) -> linux:17 (KEY_W) -> atset1:17 */
 | 
			
		||||
  "KeyX": 0x2d, /* html:KeyX (KeyX) -> linux:45 (KEY_X) -> atset1:45 */
 | 
			
		||||
  "KeyY": 0x15, /* html:KeyY (KeyY) -> linux:21 (KEY_Y) -> atset1:21 */
 | 
			
		||||
  "KeyZ": 0x2c, /* html:KeyZ (KeyZ) -> linux:44 (KEY_Z) -> atset1:44 */
 | 
			
		||||
  "Lang3": 0x78, /* html:Lang3 (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */
 | 
			
		||||
  "Lang4": 0x77, /* html:Lang4 (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */
 | 
			
		||||
  "Lang5": 0x76, /* html:Lang5 (Lang5) -> linux:85 (KEY_ZENKAKUHANKAKU) -> atset1:118 */
 | 
			
		||||
  "LaunchApp1": 0xe06b, /* html:LaunchApp1 (LaunchApp1) -> linux:157 (KEY_COMPUTER) -> atset1:57451 */
 | 
			
		||||
  "LaunchApp2": 0xe021, /* html:LaunchApp2 (LaunchApp2) -> linux:140 (KEY_CALC) -> atset1:57377 */
 | 
			
		||||
  "LaunchMail": 0xe06c, /* html:LaunchMail (LaunchMail) -> linux:155 (KEY_MAIL) -> atset1:57452 */
 | 
			
		||||
  "MediaPlayPause": 0xe022, /* html:MediaPlayPause (MediaPlayPause) -> linux:164 (KEY_PLAYPAUSE) -> atset1:57378 */
 | 
			
		||||
  "MediaSelect": 0xe06d, /* html:MediaSelect (MediaSelect) -> linux:226 (KEY_MEDIA) -> atset1:57453 */
 | 
			
		||||
  "MediaStop": 0xe024, /* html:MediaStop (MediaStop) -> linux:166 (KEY_STOPCD) -> atset1:57380 */
 | 
			
		||||
  "MediaTrackNext": 0xe019, /* html:MediaTrackNext (MediaTrackNext) -> linux:163 (KEY_NEXTSONG) -> atset1:57369 */
 | 
			
		||||
  "MediaTrackPrevious": 0xe010, /* html:MediaTrackPrevious (MediaTrackPrevious) -> linux:165 (KEY_PREVIOUSSONG) -> atset1:57360 */
 | 
			
		||||
  "MetaLeft": 0xe05b, /* html:MetaLeft (MetaLeft) -> linux:125 (KEY_LEFTMETA) -> atset1:57435 */
 | 
			
		||||
  "MetaRight": 0xe05c, /* html:MetaRight (MetaRight) -> linux:126 (KEY_RIGHTMETA) -> atset1:57436 */
 | 
			
		||||
  "Minus": 0xc, /* html:Minus (Minus) -> linux:12 (KEY_MINUS) -> atset1:12 */
 | 
			
		||||
  "NonConvert": 0x7b, /* html:NonConvert (NonConvert) -> linux:94 (KEY_MUHENKAN) -> atset1:123 */
 | 
			
		||||
  "NumLock": 0x45, /* html:NumLock (NumLock) -> linux:69 (KEY_NUMLOCK) -> atset1:69 */
 | 
			
		||||
  "Numpad0": 0x52, /* html:Numpad0 (Numpad0) -> linux:82 (KEY_KP0) -> atset1:82 */
 | 
			
		||||
  "Numpad1": 0x4f, /* html:Numpad1 (Numpad1) -> linux:79 (KEY_KP1) -> atset1:79 */
 | 
			
		||||
  "Numpad2": 0x50, /* html:Numpad2 (Numpad2) -> linux:80 (KEY_KP2) -> atset1:80 */
 | 
			
		||||
  "Numpad3": 0x51, /* html:Numpad3 (Numpad3) -> linux:81 (KEY_KP3) -> atset1:81 */
 | 
			
		||||
  "Numpad4": 0x4b, /* html:Numpad4 (Numpad4) -> linux:75 (KEY_KP4) -> atset1:75 */
 | 
			
		||||
  "Numpad5": 0x4c, /* html:Numpad5 (Numpad5) -> linux:76 (KEY_KP5) -> atset1:76 */
 | 
			
		||||
  "Numpad6": 0x4d, /* html:Numpad6 (Numpad6) -> linux:77 (KEY_KP6) -> atset1:77 */
 | 
			
		||||
  "Numpad7": 0x47, /* html:Numpad7 (Numpad7) -> linux:71 (KEY_KP7) -> atset1:71 */
 | 
			
		||||
  "Numpad8": 0x48, /* html:Numpad8 (Numpad8) -> linux:72 (KEY_KP8) -> atset1:72 */
 | 
			
		||||
  "Numpad9": 0x49, /* html:Numpad9 (Numpad9) -> linux:73 (KEY_KP9) -> atset1:73 */
 | 
			
		||||
  "NumpadAdd": 0x4e, /* html:NumpadAdd (NumpadAdd) -> linux:78 (KEY_KPPLUS) -> atset1:78 */
 | 
			
		||||
  "NumpadComma": 0x7e, /* html:NumpadComma (NumpadComma) -> linux:121 (KEY_KPCOMMA) -> atset1:126 */
 | 
			
		||||
  "NumpadDecimal": 0x53, /* html:NumpadDecimal (NumpadDecimal) -> linux:83 (KEY_KPDOT) -> atset1:83 */
 | 
			
		||||
  "NumpadDivide": 0xe035, /* html:NumpadDivide (NumpadDivide) -> linux:98 (KEY_KPSLASH) -> atset1:57397 */
 | 
			
		||||
  "NumpadEnter": 0xe01c, /* html:NumpadEnter (NumpadEnter) -> linux:96 (KEY_KPENTER) -> atset1:57372 */
 | 
			
		||||
  "NumpadEqual": 0x59, /* html:NumpadEqual (NumpadEqual) -> linux:117 (KEY_KPEQUAL) -> atset1:89 */
 | 
			
		||||
  "NumpadMultiply": 0x37, /* html:NumpadMultiply (NumpadMultiply) -> linux:55 (KEY_KPASTERISK) -> atset1:55 */
 | 
			
		||||
  "NumpadParenLeft": 0xe076, /* html:NumpadParenLeft (NumpadParenLeft) -> linux:179 (KEY_KPLEFTPAREN) -> atset1:57462 */
 | 
			
		||||
  "NumpadParenRight": 0xe07b, /* html:NumpadParenRight (NumpadParenRight) -> linux:180 (KEY_KPRIGHTPAREN) -> atset1:57467 */
 | 
			
		||||
  "NumpadSubtract": 0x4a, /* html:NumpadSubtract (NumpadSubtract) -> linux:74 (KEY_KPMINUS) -> atset1:74 */
 | 
			
		||||
  "Open": 0x64, /* html:Open (Open) -> linux:134 (KEY_OPEN) -> atset1:100 */
 | 
			
		||||
  "PageDown": 0xe051, /* html:PageDown (PageDown) -> linux:109 (KEY_PAGEDOWN) -> atset1:57425 */
 | 
			
		||||
  "PageUp": 0xe049, /* html:PageUp (PageUp) -> linux:104 (KEY_PAGEUP) -> atset1:57417 */
 | 
			
		||||
  "Paste": 0x65, /* html:Paste (Paste) -> linux:135 (KEY_PASTE) -> atset1:101 */
 | 
			
		||||
  "Pause": 0xe046, /* html:Pause (Pause) -> linux:119 (KEY_PAUSE) -> atset1:57414 */
 | 
			
		||||
  "Period": 0x34, /* html:Period (Period) -> linux:52 (KEY_DOT) -> atset1:52 */
 | 
			
		||||
  "Power": 0xe05e, /* html:Power (Power) -> linux:116 (KEY_POWER) -> atset1:57438 */
 | 
			
		||||
  "PrintScreen": 0x54, /* html:PrintScreen (PrintScreen) -> linux:99 (KEY_SYSRQ) -> atset1:84 */
 | 
			
		||||
  "Props": 0xe006, /* html:Props (Props) -> linux:130 (KEY_PROPS) -> atset1:57350 */
 | 
			
		||||
  "Quote": 0x28, /* html:Quote (Quote) -> linux:40 (KEY_APOSTROPHE) -> atset1:40 */
 | 
			
		||||
  "ScrollLock": 0x46, /* html:ScrollLock (ScrollLock) -> linux:70 (KEY_SCROLLLOCK) -> atset1:70 */
 | 
			
		||||
  "Semicolon": 0x27, /* html:Semicolon (Semicolon) -> linux:39 (KEY_SEMICOLON) -> atset1:39 */
 | 
			
		||||
  "ShiftLeft": 0x2a, /* html:ShiftLeft (ShiftLeft) -> linux:42 (KEY_LEFTSHIFT) -> atset1:42 */
 | 
			
		||||
  "ShiftRight": 0x36, /* html:ShiftRight (ShiftRight) -> linux:54 (KEY_RIGHTSHIFT) -> atset1:54 */
 | 
			
		||||
  "Slash": 0x35, /* html:Slash (Slash) -> linux:53 (KEY_SLASH) -> atset1:53 */
 | 
			
		||||
  "Sleep": 0xe05f, /* html:Sleep (Sleep) -> linux:142 (KEY_SLEEP) -> atset1:57439 */
 | 
			
		||||
  "Space": 0x39, /* html:Space (Space) -> linux:57 (KEY_SPACE) -> atset1:57 */
 | 
			
		||||
  "Suspend": 0xe025, /* html:Suspend (Suspend) -> linux:205 (KEY_SUSPEND) -> atset1:57381 */
 | 
			
		||||
  "Tab": 0xf, /* html:Tab (Tab) -> linux:15 (KEY_TAB) -> atset1:15 */
 | 
			
		||||
  "Undo": 0xe007, /* html:Undo (Undo) -> linux:131 (KEY_UNDO) -> atset1:57351 */
 | 
			
		||||
  "WakeUp": 0xe063 /* html:WakeUp (WakeUp) -> linux:143 (KEY_WAKEUP) -> atset1:57443 */
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										2661
									
								
								static/js/novnc/core/rfb.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										80
									
								
								static/js/novnc/core/util/browser.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,80 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.isTouchDevice = undefined;
 | 
			
		||||
exports.supportsCursorURIs = supportsCursorURIs;
 | 
			
		||||
exports.isMac = isMac;
 | 
			
		||||
exports.isIE = isIE;
 | 
			
		||||
exports.isEdge = isEdge;
 | 
			
		||||
exports.isWindows = isWindows;
 | 
			
		||||
exports.isIOS = isIOS;
 | 
			
		||||
 | 
			
		||||
var _logging = require('./logging.js');
 | 
			
		||||
 | 
			
		||||
var Log = _interopRequireWildcard(_logging);
 | 
			
		||||
 | 
			
		||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 | 
			
		||||
 | 
			
		||||
// Touch detection
 | 
			
		||||
var isTouchDevice = exports.isTouchDevice = 'ontouchstart' in document.documentElement ||
 | 
			
		||||
// requried for Chrome debugger
 | 
			
		||||
document.ontouchstart !== undefined ||
 | 
			
		||||
// required for MS Surface
 | 
			
		||||
navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; /*
 | 
			
		||||
                                                                 * 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.
 | 
			
		||||
                                                                 */
 | 
			
		||||
 | 
			
		||||
window.addEventListener('touchstart', function onFirstTouch() {
 | 
			
		||||
    exports.isTouchDevice = isTouchDevice = true;
 | 
			
		||||
    window.removeEventListener('touchstart', onFirstTouch, false);
 | 
			
		||||
}, false);
 | 
			
		||||
 | 
			
		||||
var _cursor_uris_supported = null;
 | 
			
		||||
 | 
			
		||||
function supportsCursorURIs() {
 | 
			
		||||
    if (_cursor_uris_supported === null) {
 | 
			
		||||
        try {
 | 
			
		||||
            var target = document.createElement('canvas');
 | 
			
		||||
            target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default';
 | 
			
		||||
 | 
			
		||||
            if (target.style.cursor) {
 | 
			
		||||
                Log.Info("Data URI scheme cursor supported");
 | 
			
		||||
                _cursor_uris_supported = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                Log.Warn("Data URI scheme cursor not supported");
 | 
			
		||||
                _cursor_uris_supported = false;
 | 
			
		||||
            }
 | 
			
		||||
        } catch (exc) {
 | 
			
		||||
            Log.Error("Data URI scheme cursor test exception: " + exc);
 | 
			
		||||
            _cursor_uris_supported = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return _cursor_uris_supported;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function isMac() {
 | 
			
		||||
    return navigator && !!/mac/i.exec(navigator.platform);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isIE() {
 | 
			
		||||
    return navigator && !!/trident/i.exec(navigator.userAgent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isEdge() {
 | 
			
		||||
    return navigator && !!/edge/i.exec(navigator.userAgent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isWindows() {
 | 
			
		||||
    return navigator && !!/win/i.exec(navigator.platform);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isIOS() {
 | 
			
		||||
    return navigator && (!!/ipad/i.exec(navigator.platform) || !!/iphone/i.exec(navigator.platform) || !!/ipod/i.exec(navigator.platform));
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										145
									
								
								static/js/novnc/core/util/events.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,145 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.getPointerEvent = getPointerEvent;
 | 
			
		||||
exports.stopEvent = stopEvent;
 | 
			
		||||
exports.setCapture = setCapture;
 | 
			
		||||
exports.releaseCapture = releaseCapture;
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Cross-browser event and position routines
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
function getPointerEvent(e) {
 | 
			
		||||
    return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function stopEvent(e) {
 | 
			
		||||
    e.stopPropagation();
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Emulate Element.setCapture() when not supported
 | 
			
		||||
var _captureRecursion = false;
 | 
			
		||||
var _captureElem = null;
 | 
			
		||||
function _captureProxy(e) {
 | 
			
		||||
    // Recursion protection as we'll see our own event
 | 
			
		||||
    if (_captureRecursion) return;
 | 
			
		||||
 | 
			
		||||
    // Clone the event as we cannot dispatch an already dispatched event
 | 
			
		||||
    var newEv = new e.constructor(e.type, e);
 | 
			
		||||
 | 
			
		||||
    _captureRecursion = true;
 | 
			
		||||
    _captureElem.dispatchEvent(newEv);
 | 
			
		||||
    _captureRecursion = false;
 | 
			
		||||
 | 
			
		||||
    // Avoid double events
 | 
			
		||||
    e.stopPropagation();
 | 
			
		||||
 | 
			
		||||
    // Respect the wishes of the redirected event handlers
 | 
			
		||||
    if (newEv.defaultPrevented) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Implicitly release the capture on button release
 | 
			
		||||
    if (e.type === "mouseup") {
 | 
			
		||||
        releaseCapture();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Follow cursor style of target element
 | 
			
		||||
function _captureElemChanged() {
 | 
			
		||||
    var captureElem = document.getElementById("noVNC_mouse_capture_elem");
 | 
			
		||||
    captureElem.style.cursor = window.getComputedStyle(_captureElem).cursor;
 | 
			
		||||
};
 | 
			
		||||
var _captureObserver = new MutationObserver(_captureElemChanged);
 | 
			
		||||
 | 
			
		||||
var _captureIndex = 0;
 | 
			
		||||
 | 
			
		||||
function setCapture(elem) {
 | 
			
		||||
    if (elem.setCapture) {
 | 
			
		||||
 | 
			
		||||
        elem.setCapture();
 | 
			
		||||
 | 
			
		||||
        // IE releases capture on 'click' events which might not trigger
 | 
			
		||||
        elem.addEventListener('mouseup', releaseCapture);
 | 
			
		||||
    } else {
 | 
			
		||||
        // Release any existing capture in case this method is
 | 
			
		||||
        // called multiple times without coordination
 | 
			
		||||
        releaseCapture();
 | 
			
		||||
 | 
			
		||||
        var captureElem = document.getElementById("noVNC_mouse_capture_elem");
 | 
			
		||||
 | 
			
		||||
        if (captureElem === null) {
 | 
			
		||||
            captureElem = document.createElement("div");
 | 
			
		||||
            captureElem.id = "noVNC_mouse_capture_elem";
 | 
			
		||||
            captureElem.style.position = "fixed";
 | 
			
		||||
            captureElem.style.top = "0px";
 | 
			
		||||
            captureElem.style.left = "0px";
 | 
			
		||||
            captureElem.style.width = "100%";
 | 
			
		||||
            captureElem.style.height = "100%";
 | 
			
		||||
            captureElem.style.zIndex = 10000;
 | 
			
		||||
            captureElem.style.display = "none";
 | 
			
		||||
            document.body.appendChild(captureElem);
 | 
			
		||||
 | 
			
		||||
            // This is to make sure callers don't get confused by having
 | 
			
		||||
            // our blocking element as the target
 | 
			
		||||
            captureElem.addEventListener('contextmenu', _captureProxy);
 | 
			
		||||
 | 
			
		||||
            captureElem.addEventListener('mousemove', _captureProxy);
 | 
			
		||||
            captureElem.addEventListener('mouseup', _captureProxy);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _captureElem = elem;
 | 
			
		||||
        _captureIndex++;
 | 
			
		||||
 | 
			
		||||
        // Track cursor and get initial cursor
 | 
			
		||||
        _captureObserver.observe(elem, { attributes: true });
 | 
			
		||||
        _captureElemChanged();
 | 
			
		||||
 | 
			
		||||
        captureElem.style.display = "";
 | 
			
		||||
 | 
			
		||||
        // We listen to events on window in order to keep tracking if it
 | 
			
		||||
        // happens to leave the viewport
 | 
			
		||||
        window.addEventListener('mousemove', _captureProxy);
 | 
			
		||||
        window.addEventListener('mouseup', _captureProxy);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function releaseCapture() {
 | 
			
		||||
    if (document.releaseCapture) {
 | 
			
		||||
 | 
			
		||||
        document.releaseCapture();
 | 
			
		||||
    } else {
 | 
			
		||||
        if (!_captureElem) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // There might be events already queued, so we need to wait for
 | 
			
		||||
        // them to flush. E.g. contextmenu in Microsoft Edge
 | 
			
		||||
        window.setTimeout(function (expected) {
 | 
			
		||||
            // Only clear it if it's the expected grab (i.e. no one
 | 
			
		||||
            // else has initiated a new grab)
 | 
			
		||||
            if (_captureIndex === expected) {
 | 
			
		||||
                _captureElem = null;
 | 
			
		||||
            }
 | 
			
		||||
        }, 0, _captureIndex);
 | 
			
		||||
 | 
			
		||||
        _captureObserver.disconnect();
 | 
			
		||||
 | 
			
		||||
        var captureElem = document.getElementById("noVNC_mouse_capture_elem");
 | 
			
		||||
        captureElem.style.display = "none";
 | 
			
		||||
 | 
			
		||||
        window.removeEventListener('mousemove', _captureProxy);
 | 
			
		||||
        window.removeEventListener('mouseup', _captureProxy);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										45
									
								
								static/js/novnc/core/util/eventtarget.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,45 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
   value: true
 | 
			
		||||
});
 | 
			
		||||
/*
 | 
			
		||||
 * noVNC: HTML5 VNC client
 | 
			
		||||
 * Copyright 2017 Pierre Ossman for Cendio AB
 | 
			
		||||
 * Licensed under MPL 2.0 (see LICENSE.txt)
 | 
			
		||||
 *
 | 
			
		||||
 * See README.md for usage and integration instructions.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
var EventTargetMixin = {
 | 
			
		||||
   _listeners: null,
 | 
			
		||||
 | 
			
		||||
   addEventListener: function (type, callback) {
 | 
			
		||||
      if (!this._listeners) {
 | 
			
		||||
         this._listeners = new Map();
 | 
			
		||||
      }
 | 
			
		||||
      if (!this._listeners.has(type)) {
 | 
			
		||||
         this._listeners.set(type, new Set());
 | 
			
		||||
      }
 | 
			
		||||
      this._listeners.get(type).add(callback);
 | 
			
		||||
   },
 | 
			
		||||
 | 
			
		||||
   removeEventListener: function (type, callback) {
 | 
			
		||||
      if (!this._listeners || !this._listeners.has(type)) {
 | 
			
		||||
         return;
 | 
			
		||||
      }
 | 
			
		||||
      this._listeners.get(type).delete(callback);
 | 
			
		||||
   },
 | 
			
		||||
 | 
			
		||||
   dispatchEvent: function (event) {
 | 
			
		||||
      if (!this._listeners || !this._listeners.has(event.type)) {
 | 
			
		||||
         return true;
 | 
			
		||||
      }
 | 
			
		||||
      this._listeners.get(event.type).forEach(function (callback) {
 | 
			
		||||
         callback.call(this, event);
 | 
			
		||||
      }, this);
 | 
			
		||||
      return !event.defaultPrevented;
 | 
			
		||||
   }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
exports.default = EventTargetMixin;
 | 
			
		||||
							
								
								
									
										62
									
								
								static/js/novnc/core/util/logging.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.init_logging = init_logging;
 | 
			
		||||
exports.get_logging = get_logging;
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Logging/debug routines
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
var _log_level = 'warn';
 | 
			
		||||
 | 
			
		||||
var Debug = function (msg) {};
 | 
			
		||||
var Info = function (msg) {};
 | 
			
		||||
var Warn = function (msg) {};
 | 
			
		||||
var Error = function (msg) {};
 | 
			
		||||
 | 
			
		||||
function init_logging(level) {
 | 
			
		||||
    if (typeof level === 'undefined') {
 | 
			
		||||
        level = _log_level;
 | 
			
		||||
    } else {
 | 
			
		||||
        _log_level = level;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    exports.Debug = Debug = exports.Info = Info = exports.Warn = Warn = exports.Error = Error = function (msg) {};
 | 
			
		||||
    if (typeof window.console !== "undefined") {
 | 
			
		||||
        switch (level) {
 | 
			
		||||
            case 'debug':
 | 
			
		||||
                exports.Debug = Debug = console.debug.bind(window.console);
 | 
			
		||||
            case 'info':
 | 
			
		||||
                exports.Info = Info = console.info.bind(window.console);
 | 
			
		||||
            case 'warn':
 | 
			
		||||
                exports.Warn = Warn = console.warn.bind(window.console);
 | 
			
		||||
            case 'error':
 | 
			
		||||
                exports.Error = Error = console.error.bind(window.console);
 | 
			
		||||
            case 'none':
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                throw new Error("invalid logging type '" + level + "'");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
function get_logging() {
 | 
			
		||||
    return _log_level;
 | 
			
		||||
};
 | 
			
		||||
exports.Debug = Debug;
 | 
			
		||||
exports.Info = Info;
 | 
			
		||||
exports.Warn = Warn;
 | 
			
		||||
exports.Error = Error;
 | 
			
		||||
 | 
			
		||||
// Initialize logging level
 | 
			
		||||
 | 
			
		||||
init_logging();
 | 
			
		||||
							
								
								
									
										60
									
								
								static/js/novnc/core/util/polyfill.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * noVNC: HTML5 VNC client
 | 
			
		||||
 * Copyright 2017 Pierre Ossman for noVNC
 | 
			
		||||
 * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Polyfills to provide new APIs in old browsers */
 | 
			
		||||
 | 
			
		||||
/* Object.assign() (taken from MDN) */
 | 
			
		||||
if (typeof Object.assign != 'function') {
 | 
			
		||||
    // Must be writable: true, enumerable: false, configurable: true
 | 
			
		||||
    Object.defineProperty(Object, "assign", {
 | 
			
		||||
        value: function assign(target, varArgs) {
 | 
			
		||||
            // .length of function is 2
 | 
			
		||||
            'use strict';
 | 
			
		||||
 | 
			
		||||
            if (target == null) {
 | 
			
		||||
                // TypeError if undefined or null
 | 
			
		||||
                throw new TypeError('Cannot convert undefined or null to object');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var to = Object(target);
 | 
			
		||||
 | 
			
		||||
            for (var index = 1; index < arguments.length; index++) {
 | 
			
		||||
                var nextSource = arguments[index];
 | 
			
		||||
 | 
			
		||||
                if (nextSource != null) {
 | 
			
		||||
                    // Skip over if undefined or null
 | 
			
		||||
                    for (var nextKey in nextSource) {
 | 
			
		||||
                        // Avoid bugs when hasOwnProperty is shadowed
 | 
			
		||||
                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
 | 
			
		||||
                            to[nextKey] = nextSource[nextKey];
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return to;
 | 
			
		||||
        },
 | 
			
		||||
        writable: true,
 | 
			
		||||
        configurable: true
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* CustomEvent constructor (taken from MDN) */
 | 
			
		||||
(function () {
 | 
			
		||||
    function CustomEvent(event, params) {
 | 
			
		||||
        params = params || { bubbles: false, cancelable: false, detail: undefined };
 | 
			
		||||
        var evt = document.createEvent('CustomEvent');
 | 
			
		||||
        evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
 | 
			
		||||
        return evt;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    CustomEvent.prototype = window.Event.prototype;
 | 
			
		||||
 | 
			
		||||
    if (typeof window.CustomEvent !== "function") {
 | 
			
		||||
        window.CustomEvent = CustomEvent;
 | 
			
		||||
    }
 | 
			
		||||
})();
 | 
			
		||||
							
								
								
									
										22
									
								
								static/js/novnc/core/util/strings.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
  value: true
 | 
			
		||||
});
 | 
			
		||||
exports.decodeUTF8 = decodeUTF8;
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Decode from UTF-8
 | 
			
		||||
 */
 | 
			
		||||
function decodeUTF8(utf8string) {
 | 
			
		||||
  "use strict";
 | 
			
		||||
 | 
			
		||||
  return decodeURIComponent(escape(utf8string));
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										331
									
								
								static/js/novnc/core/websock.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,331 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
    value: true
 | 
			
		||||
});
 | 
			
		||||
exports.default = Websock;
 | 
			
		||||
 | 
			
		||||
var _logging = require('./util/logging.js');
 | 
			
		||||
 | 
			
		||||
var Log = _interopRequireWildcard(_logging);
 | 
			
		||||
 | 
			
		||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 | 
			
		||||
 | 
			
		||||
function Websock() {
 | 
			
		||||
    "use strict";
 | 
			
		||||
 | 
			
		||||
    this._websocket = null; // WebSocket object
 | 
			
		||||
 | 
			
		||||
    this._rQi = 0; // Receive queue index
 | 
			
		||||
    this._rQlen = 0; // Next write position in the receive queue
 | 
			
		||||
    this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB)
 | 
			
		||||
    this._rQmax = this._rQbufferSize / 8;
 | 
			
		||||
    // called in init: this._rQ = new Uint8Array(this._rQbufferSize);
 | 
			
		||||
    this._rQ = null; // Receive queue
 | 
			
		||||
 | 
			
		||||
    this._sQbufferSize = 1024 * 10; // 10 KiB
 | 
			
		||||
    // called in init: this._sQ = new Uint8Array(this._sQbufferSize);
 | 
			
		||||
    this._sQlen = 0;
 | 
			
		||||
    this._sQ = null; // Send queue
 | 
			
		||||
 | 
			
		||||
    this._eventHandlers = {
 | 
			
		||||
        'message': function () {},
 | 
			
		||||
        'open': function () {},
 | 
			
		||||
        'close': function () {},
 | 
			
		||||
        'error': function () {}
 | 
			
		||||
    };
 | 
			
		||||
} /*
 | 
			
		||||
   * 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 with extra
 | 
			
		||||
   * buffer handling.
 | 
			
		||||
   *
 | 
			
		||||
   * 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.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
// this has performance issues in some versions Chromium, and
 | 
			
		||||
// doesn't gain a tremendous amount of performance increase in Firefox
 | 
			
		||||
// at the moment.  It may be valuable to turn it on in the future.
 | 
			
		||||
var ENABLE_COPYWITHIN = false;
 | 
			
		||||
 | 
			
		||||
var MAX_RQ_GROW_SIZE = 40 * 1024 * 1024; // 40 MiB
 | 
			
		||||
 | 
			
		||||
var typedArrayToString = function () {
 | 
			
		||||
    // This is only for PhantomJS, which doesn't like apply-ing
 | 
			
		||||
    // with Typed Arrays
 | 
			
		||||
    try {
 | 
			
		||||
        var arr = new Uint8Array([1, 2, 3]);
 | 
			
		||||
        String.fromCharCode.apply(null, arr);
 | 
			
		||||
        return function (a) {
 | 
			
		||||
            return String.fromCharCode.apply(null, a);
 | 
			
		||||
        };
 | 
			
		||||
    } catch (ex) {
 | 
			
		||||
        return function (a) {
 | 
			
		||||
            return String.fromCharCode.apply(null, Array.prototype.slice.call(a));
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}();
 | 
			
		||||
 | 
			
		||||
Websock.prototype = {
 | 
			
		||||
    // Getters and Setters
 | 
			
		||||
    get_sQ: function () {
 | 
			
		||||
        return this._sQ;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get_rQ: function () {
 | 
			
		||||
        return this._rQ;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get_rQi: function () {
 | 
			
		||||
        return this._rQi;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    set_rQi: function (val) {
 | 
			
		||||
        this._rQi = val;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Receive Queue
 | 
			
		||||
    rQlen: function () {
 | 
			
		||||
        return this._rQlen - this._rQi;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQpeek8: function () {
 | 
			
		||||
        return this._rQ[this._rQi];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQshift8: function () {
 | 
			
		||||
        return this._rQ[this._rQi++];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQskip8: function () {
 | 
			
		||||
        this._rQi++;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQskipBytes: function (num) {
 | 
			
		||||
        this._rQi += num;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // TODO(directxman12): test performance with these vs a DataView
 | 
			
		||||
    rQshift16: function () {
 | 
			
		||||
        return (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQshift32: function () {
 | 
			
		||||
        return (this._rQ[this._rQi++] << 24) + (this._rQ[this._rQi++] << 16) + (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQshiftStr: function (len) {
 | 
			
		||||
        if (typeof len === 'undefined') {
 | 
			
		||||
            len = this.rQlen();
 | 
			
		||||
        }
 | 
			
		||||
        var arr = new Uint8Array(this._rQ.buffer, this._rQi, len);
 | 
			
		||||
        this._rQi += len;
 | 
			
		||||
        return typedArrayToString(arr);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQshiftBytes: function (len) {
 | 
			
		||||
        if (typeof len === 'undefined') {
 | 
			
		||||
            len = this.rQlen();
 | 
			
		||||
        }
 | 
			
		||||
        this._rQi += len;
 | 
			
		||||
        return new Uint8Array(this._rQ.buffer, this._rQi - len, len);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQshiftTo: function (target, len) {
 | 
			
		||||
        if (len === undefined) {
 | 
			
		||||
            len = this.rQlen();
 | 
			
		||||
        }
 | 
			
		||||
        // TODO: make this just use set with views when using a ArrayBuffer to store the rQ
 | 
			
		||||
        target.set(new Uint8Array(this._rQ.buffer, this._rQi, len));
 | 
			
		||||
        this._rQi += len;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQwhole: function () {
 | 
			
		||||
        return new Uint8Array(this._rQ.buffer, 0, this._rQlen);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    rQslice: function (start, end) {
 | 
			
		||||
        if (end) {
 | 
			
		||||
            return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start);
 | 
			
		||||
        } else {
 | 
			
		||||
            return new Uint8Array(this._rQ.buffer, this._rQi + start, this._rQlen - this._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.
 | 
			
		||||
    rQwait: function (msg, num, goback) {
 | 
			
		||||
        var rQlen = this._rQlen - this._rQi; // Skip rQlen() function call
 | 
			
		||||
        if (rQlen < num) {
 | 
			
		||||
            if (goback) {
 | 
			
		||||
                if (this._rQi < goback) {
 | 
			
		||||
                    throw new Error("rQwait cannot backup " + goback + " bytes");
 | 
			
		||||
                }
 | 
			
		||||
                this._rQi -= goback;
 | 
			
		||||
            }
 | 
			
		||||
            return true; // true means need more data
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Send Queue
 | 
			
		||||
 | 
			
		||||
    flush: function () {
 | 
			
		||||
        if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) {
 | 
			
		||||
            this._websocket.send(this._encode_message());
 | 
			
		||||
            this._sQlen = 0;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    send: function (arr) {
 | 
			
		||||
        this._sQ.set(arr, this._sQlen);
 | 
			
		||||
        this._sQlen += arr.length;
 | 
			
		||||
        this.flush();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    send_string: function (str) {
 | 
			
		||||
        this.send(str.split('').map(function (chr) {
 | 
			
		||||
            return chr.charCodeAt(0);
 | 
			
		||||
        }));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Event Handlers
 | 
			
		||||
    off: function (evt) {
 | 
			
		||||
        this._eventHandlers[evt] = function () {};
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    on: function (evt, handler) {
 | 
			
		||||
        this._eventHandlers[evt] = handler;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _allocate_buffers: function () {
 | 
			
		||||
        this._rQ = new Uint8Array(this._rQbufferSize);
 | 
			
		||||
        this._sQ = new Uint8Array(this._sQbufferSize);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    init: function () {
 | 
			
		||||
        this._allocate_buffers();
 | 
			
		||||
        this._rQi = 0;
 | 
			
		||||
        this._websocket = null;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    open: function (uri, protocols) {
 | 
			
		||||
        var ws_schema = uri.match(/^([a-z]+):\/\//)[1];
 | 
			
		||||
        this.init();
 | 
			
		||||
 | 
			
		||||
        this._websocket = new WebSocket(uri, protocols);
 | 
			
		||||
        this._websocket.binaryType = 'arraybuffer';
 | 
			
		||||
 | 
			
		||||
        this._websocket.onmessage = this._recv_message.bind(this);
 | 
			
		||||
        this._websocket.onopen = function () {
 | 
			
		||||
            Log.Debug('>> WebSock.onopen');
 | 
			
		||||
            if (this._websocket.protocol) {
 | 
			
		||||
                Log.Info("Server choose sub-protocol: " + this._websocket.protocol);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._eventHandlers.open();
 | 
			
		||||
            Log.Debug("<< WebSock.onopen");
 | 
			
		||||
        }.bind(this);
 | 
			
		||||
        this._websocket.onclose = function (e) {
 | 
			
		||||
            Log.Debug(">> WebSock.onclose");
 | 
			
		||||
            this._eventHandlers.close(e);
 | 
			
		||||
            Log.Debug("<< WebSock.onclose");
 | 
			
		||||
        }.bind(this);
 | 
			
		||||
        this._websocket.onerror = function (e) {
 | 
			
		||||
            Log.Debug(">> WebSock.onerror: " + e);
 | 
			
		||||
            this._eventHandlers.error(e);
 | 
			
		||||
            Log.Debug("<< WebSock.onerror: " + e);
 | 
			
		||||
        }.bind(this);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    close: function () {
 | 
			
		||||
        if (this._websocket) {
 | 
			
		||||
            if (this._websocket.readyState === WebSocket.OPEN || this._websocket.readyState === WebSocket.CONNECTING) {
 | 
			
		||||
                Log.Info("Closing WebSocket connection");
 | 
			
		||||
                this._websocket.close();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._websocket.onmessage = function (e) {
 | 
			
		||||
                return;
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // private methods
 | 
			
		||||
    _encode_message: function () {
 | 
			
		||||
        // Put in a binary arraybuffer
 | 
			
		||||
        // according to the spec, you can send ArrayBufferViews with the send method
 | 
			
		||||
        return new Uint8Array(this._sQ.buffer, 0, this._sQlen);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _expand_compact_rQ: function (min_fit) {
 | 
			
		||||
        var resizeNeeded = min_fit || this._rQlen - this._rQi > this._rQbufferSize / 2;
 | 
			
		||||
        if (resizeNeeded) {
 | 
			
		||||
            if (!min_fit) {
 | 
			
		||||
                // just double the size if we need to do compaction
 | 
			
		||||
                this._rQbufferSize *= 2;
 | 
			
		||||
            } else {
 | 
			
		||||
                // otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8
 | 
			
		||||
                this._rQbufferSize = (this._rQlen - this._rQi + min_fit) * 8;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // we don't want to grow unboundedly
 | 
			
		||||
        if (this._rQbufferSize > MAX_RQ_GROW_SIZE) {
 | 
			
		||||
            this._rQbufferSize = MAX_RQ_GROW_SIZE;
 | 
			
		||||
            if (this._rQbufferSize - this._rQlen - this._rQi < min_fit) {
 | 
			
		||||
                throw new Exception("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (resizeNeeded) {
 | 
			
		||||
            var old_rQbuffer = this._rQ.buffer;
 | 
			
		||||
            this._rQmax = this._rQbufferSize / 8;
 | 
			
		||||
            this._rQ = new Uint8Array(this._rQbufferSize);
 | 
			
		||||
            this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi));
 | 
			
		||||
        } else {
 | 
			
		||||
            if (ENABLE_COPYWITHIN) {
 | 
			
		||||
                this._rQ.copyWithin(0, this._rQi);
 | 
			
		||||
            } else {
 | 
			
		||||
                this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._rQlen = this._rQlen - this._rQi;
 | 
			
		||||
        this._rQi = 0;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _decode_message: function (data) {
 | 
			
		||||
        // push arraybuffer values onto the end
 | 
			
		||||
        var u8 = new Uint8Array(data);
 | 
			
		||||
        if (u8.length > this._rQbufferSize - this._rQlen) {
 | 
			
		||||
            this._expand_compact_rQ(u8.length);
 | 
			
		||||
        }
 | 
			
		||||
        this._rQ.set(u8, this._rQlen);
 | 
			
		||||
        this._rQlen += u8.length;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _recv_message: function (e) {
 | 
			
		||||
        this._decode_message(e.data);
 | 
			
		||||
        if (this.rQlen() > 0) {
 | 
			
		||||
            this._eventHandlers.message();
 | 
			
		||||
            // Compact the receive queue
 | 
			
		||||
            if (this._rQlen == this._rQi) {
 | 
			
		||||
                this._rQlen = 0;
 | 
			
		||||
                this._rQi = 0;
 | 
			
		||||
            } else if (this._rQlen > this._rQmax) {
 | 
			
		||||
                this._expand_compact_rQ();
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            Log.Debug("Ignoring empty message");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -1,273 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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 <dzimm@widget.com>, 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 <jef@acme.com>.  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<<m)) !== 0) ? 1: 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 16; ++i) {
 | 
			
		||||
        m = i << 1;
 | 
			
		||||
        n = m + 1;
 | 
			
		||||
        kn[m] = kn[n] = 0;
 | 
			
		||||
        for (o=28; o<59; o+=28) {
 | 
			
		||||
            for (j = o-28; j < o; ++j) {
 | 
			
		||||
                l = j + totrot[i];
 | 
			
		||||
                if (l < o) {
 | 
			
		||||
                    pcr[j] = pc1m[l];
 | 
			
		||||
                } else {
 | 
			
		||||
                    pcr[j] = pc1m[l - 28];
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for (j = 0; j < 24; ++j) {
 | 
			
		||||
            if (pcr[PC2[j]] !== 0) {
 | 
			
		||||
                kn[m] |= 1<<(23-j);
 | 
			
		||||
            }
 | 
			
		||||
            if (pcr[PC2[j + 24]] !== 0) {
 | 
			
		||||
                kn[n] |= 1<<(23-j);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // cookey
 | 
			
		||||
    for (i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
 | 
			
		||||
        raw0 = kn[rawi++];
 | 
			
		||||
        raw1 = kn[rawi++];
 | 
			
		||||
        keys[KnLi] = (raw0 & 0x00fc0000) << 6;
 | 
			
		||||
        keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
 | 
			
		||||
        keys[KnLi] |= (raw1 & 0x00fc0000) >>> 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
 | 
			
		||||
| 
						 | 
				
			
			@ -1,770 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,676 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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 };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||