| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -82,7 +82,10 @@ class ANSIParser { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // something something nothing
 | 
					 | 
					 | 
					 | 
					        // something something nothing
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.currentSequence = 0 | 
					 | 
					 | 
					 | 
					        this.currentSequence = 0 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.handler('write', character) | 
					 | 
					 | 
					 | 
					        this.handler('write', character) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      } else if (code === 0x07) this.handler('bell') | 
					 | 
					 | 
					 | 
					      } else if (code < 0x03) this.handler('_null') | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      else if (code === 0x03) this.handler('sigint') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      else if (code < 0x05) this.handler('_null') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      else if (code === 0x07) this.handler('bell') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      else if (code === 0x08) this.handler('back') | 
					 | 
					 | 
					 | 
					      else if (code === 0x08) this.handler('back') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      else if (code === 0x0a) this.handler('new-line') | 
					 | 
					 | 
					 | 
					      else if (code === 0x0a) this.handler('new-line') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      else if (code === 0x0d) this.handler('return') | 
					 | 
					 | 
					 | 
					      else if (code === 0x0d) this.handler('return') | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -203,8 +206,8 @@ class ScrollingTerminal { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } else if (action === 'return') { | 
					 | 
					 | 
					 | 
					    } else if (action === 'return') { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      this.cursor.x = 0 | 
					 | 
					 | 
					 | 
					      this.cursor.x = 0 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } else if (action === 'set-cursor') { | 
					 | 
					 | 
					 | 
					    } else if (action === 'set-cursor') { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      this.cursor.x = args[0] | 
					 | 
					 | 
					 | 
					      this.cursor.x = args[1] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      this.cursor.y = args[1] | 
					 | 
					 | 
					 | 
					      this.cursor.y = args[0] | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      this.clampCursor() | 
					 | 
					 | 
					 | 
					      this.clampCursor() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } else if (action === 'move-cursor-y') { | 
					 | 
					 | 
					 | 
					    } else if (action === 'move-cursor-y') { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      this.cursor.y += args[0] | 
					 | 
					 | 
					 | 
					      this.cursor.y += args[0] | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -370,7 +373,8 @@ let demoData = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      } | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      setTimeout(loop, 200) | 
					 | 
					 | 
					 | 
					      setTimeout(loop, 200) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  }, | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  mouseReceiver: null | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					let demoshIndex = { | 
					 | 
					 | 
					 | 
					let demoshIndex = { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -613,6 +617,69 @@ let demoshIndex = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      this.destroy() | 
					 | 
					 | 
					 | 
					      this.destroy() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }, | 
					 | 
					 | 
					 | 
					  }, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  mouse: class ShowMouse extends Process { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    constructor (shell) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      super() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.shell = shell | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    run () { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.shell.terminal.trackMouse = true | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      demoData.mouseReceiver = this | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.randomData = [] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.highlighted = {} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      let characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      for (let i = 0; i < 23; i++) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        let line = '' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (let j = 0; j < 79; j++) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          line += characters[Math.floor(characters.length * Math.random())] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        this.randomData.push(line) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.scrollOffset = 0 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.render() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    render () { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.emit('write', '\x1b[m\x1b[2J\x1b[1;1H') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.emit('write', '\x1b[97m\x1b[1mMouse Demo\r\n\x1b[mMouse movement, clicking and scrolling!') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      // render random data for scrolling
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      for (let y = 0; y < 23; y++) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        let index = y + this.scrollOffset | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        // proper modulo:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        index = ((index % this.randomData.length) + this.randomData.length) % this.randomData.length | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        let line = this.randomData[index] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        let lineData = `\x1b[${3 + y};1H\x1b[38;5;239m` | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        for (let x in line) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\x1b[97m' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          lineData += line[x] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\x1b[38;5;239m' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        this.emit('write', lineData) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      // move cursor to mouse
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if (this.mouse) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        this.emit('write', `\x1b[${this.mouse.y + 1};${this.mouse.x + 1}H`) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    mouseMove (x, y) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.mouse = { x, y } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.render() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    mouseDown (x, y, button) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if (button === 4) this.scrollOffset-- | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      else if (button === 5) this.scrollOffset++ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      else this.highlighted[y * 80 + x] = !this.highlighted[y * 80 + x] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.render() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    mouseUp (x, y, button) {} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    destroy () { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.shell.terminal.write('\x1b[2J\x1b[1;1H') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      this.shell.terminal.trackMouse = false | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if (demoData.mouseReceiver === this) demoData.mouseReceiver = null | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      super.destroy() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  }, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  pwd: '/this/is/a/demo\r\n', | 
					 | 
					 | 
					 | 
					  pwd: '/this/is/a/demo\r\n', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cd: '\x1b[38;5;239mNo directories to change to\r\n', | 
					 | 
					 | 
					 | 
					  cd: '\x1b[38;5;239mNo directories to change to\r\n', | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  whoami: `${window.navigator.userAgent}\r\n`, | 
					 | 
					 | 
					 | 
					  whoami: `${window.navigator.userAgent}\r\n`, | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -748,7 +815,16 @@ window.demoInterface = { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        else if (action instanceof Function) action(this.terminal, this.shell) | 
					 | 
					 | 
					 | 
					        else if (action instanceof Function) action(this.terminal, this.shell) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      } | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } else if (type === 'm' || type === 'p' || type === 'r') { | 
					 | 
					 | 
					 | 
					    } else if (type === 'm' || type === 'p' || type === 'r') { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      console.log(JSON.stringify(data)) | 
					 | 
					 | 
					 | 
					      let row = parse2B(content, 0) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      let column = parse2B(content, 2) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      let button = parse2B(content, 4) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      let modifiers = parse2B(content, 6) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if (demoData.mouseReceiver) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (type === 'm') demoData.mouseReceiver.mouseMove(column, row, button, modifiers) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        else if (type === 'p') demoData.mouseReceiver.mouseDown(column, row, button, modifiers) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        else if (type === 'r') demoData.mouseReceiver.mouseUp(column, row, button, modifiers) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }, | 
					 | 
					 | 
					 | 
					  }, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  init (screen) { | 
					 | 
					 | 
					 | 
					  init (screen) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |