From 7aef822563784e1d7da2f115a1b6b2ff1dd69cac Mon Sep 17 00:00:00 2001 From: leduc Date: Mon, 26 Apr 2021 02:34:15 +0200 Subject: [PATCH] Early working version --- README.md | 47 +- autorun.conf | 6 + autorun.sh | 4 + buttons.py | 85 + cls.py | 42 + cls.sh | 2 + down.sh | 2 + leds.py | 104 +- nerves.py | 225 +- websocket_server.py | 371 ++ ws.py | 216 + www/config.js | 1 + www/css/7f37946c45abf5482c243bf326f82628.eot | Bin 0 -> 45532 bytes www/css/7f37946c45abf5482c243bf326f82628.svg | 828 +++ www/css/7f37946c45abf5482c243bf326f82628.ttf | Bin 0 -> 45304 bytes www/css/7f37946c45abf5482c243bf326f82628.woff | Bin 0 -> 7828 bytes .../7f37946c45abf5482c243bf326f82628.woff2 | Bin 0 -> 4908 bytes www/css/LED.eot | Bin 0 -> 31570 bytes www/css/LED.svg | 519 ++ www/css/LED.ttf | Bin 0 -> 31420 bytes www/css/LED.woff | Bin 0 -> 12128 bytes www/css/common.css | 377 ++ www/css/font-awesome.min.css | 5 + www/css/fontawesome.css | 4522 +++++++++++++++++ www/css/newstyle.css | 165 + www/css/style.css | 1 + www/css/style2.css | 1 + www/index.html | 313 ++ www/knobs/cls.png | Bin 0 -> 2804 bytes www/knobs/down2.png | Bin 0 -> 4093 bytes www/knobs/funcs.png | Bin 0 -> 5101 bytes www/knobs/power.png | Bin 0 -> 4706 bytes www/selector.min.css | 1 + www/selector.min.js | 1 + www/touch-icon-iphone-retina-mmo3.png | Bin 0 -> 9107 bytes www/touch-icon-iphone-retina-ocs2.png | Bin 0 -> 9108 bytes www/webaudio-controls.js | 1875 +++++++ www/webcomponents-lite.js | 197 + www/webcomponents-lite.js.map | 1 + 39 files changed, 9836 insertions(+), 75 deletions(-) create mode 100644 autorun.conf create mode 100644 autorun.sh create mode 100644 buttons.py create mode 100644 cls.py create mode 100644 cls.sh create mode 100644 down.sh create mode 100755 websocket_server.py create mode 100644 ws.py create mode 100644 www/config.js create mode 100755 www/css/7f37946c45abf5482c243bf326f82628.eot create mode 100755 www/css/7f37946c45abf5482c243bf326f82628.svg create mode 100755 www/css/7f37946c45abf5482c243bf326f82628.ttf create mode 100755 www/css/7f37946c45abf5482c243bf326f82628.woff create mode 100755 www/css/7f37946c45abf5482c243bf326f82628.woff2 create mode 100644 www/css/LED.eot create mode 100644 www/css/LED.svg create mode 100644 www/css/LED.ttf create mode 100644 www/css/LED.woff create mode 100644 www/css/common.css create mode 100644 www/css/font-awesome.min.css create mode 100644 www/css/fontawesome.css create mode 100644 www/css/newstyle.css create mode 100755 www/css/style.css create mode 100755 www/css/style2.css create mode 100644 www/index.html create mode 100644 www/knobs/cls.png create mode 100644 www/knobs/down2.png create mode 100644 www/knobs/funcs.png create mode 100644 www/knobs/power.png create mode 100755 www/selector.min.css create mode 100755 www/selector.min.js create mode 100644 www/touch-icon-iphone-retina-mmo3.png create mode 100644 www/touch-icon-iphone-retina-ocs2.png create mode 100755 www/webaudio-controls.js create mode 100755 www/webcomponents-lite.js create mode 100644 www/webcomponents-lite.js.map diff --git a/README.md b/README.md index e79c672..1bc16a7 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,57 @@ # Nerves -A termeal version with led strip on raspberry pi +A termeal version with neopixel led strip on raspberry pi (Raspberry Pi 1 is fine). + +Termeal : color depends on port number of sniffed packet. + +A change mode function is included but only scapy mode work yet. + +Neopixel strip (3 wires : 5V,GND,IN) : + +* Neopixel GPIO D18 #(-> pin 12) +* GND pin 9 +* 5 V pin 4 + +Physical buttons : + +* Func button : GPIO 23 (->pin 16) / GND pin 14 +* Down button : GPIO 24 (->pin 18) / GND pin 20 + + +# Control + +2 physical buttons and Webpage (browse to pi address) + # Install sudo apt install python3-pip + sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel + sudo python3 -m pip install --force-reinstall adafruit-blinka + sudo pip3 install scapy +For automatic shutdown : + +sudo nano /etc/sudoers + +add : + +pi raspberrypi =NOPASSWD: /usr/bin/systemctl poweroff + + +# Autorun + +To autorun nerves at boot time : + +cd nerves + +sudo cp /home/pi/nerves/autorun.conf /etc/supervisor/conf.d/ +sudo supervisorctl reload # Based on previous work : -https://github.com/loloster/termeal -https://github.com/s0r00t/sniffeal \ No newline at end of file +* https://github.com/loloster/termeal +* https://github.com/s0r00t/sniffeal \ No newline at end of file diff --git a/autorun.conf b/autorun.conf new file mode 100644 index 0000000..3b5a2af --- /dev/null +++ b/autorun.conf @@ -0,0 +1,6 @@ +[program:nerves] +autorestart = True +directory = /home/pi/nerves +user = pi +command = sh /home/pi/nerves/autorun.sh +environment = STNORESTART="1", HOME="/home/pi/nerves/" diff --git a/autorun.sh b/autorun.sh new file mode 100644 index 0000000..251b602 --- /dev/null +++ b/autorun.sh @@ -0,0 +1,4 @@ +#!/bin/bash +#sudo python3 /home/pi/nerves/ws.py & +#sudo python3 /home/pi/nerves/buttons.py & +sudo python3 /home/pi/nerves/nerves.py \ No newline at end of file diff --git a/buttons.py b/buttons.py new file mode 100644 index 0000000..5c9dede --- /dev/null +++ b/buttons.py @@ -0,0 +1,85 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# -*- mode: Python -*- + +''' + +Physical buttons handler for Nerves v0.1b + +Func button : GPIO 23 (->pin 16) / ground pin 14 +Down button : GPIO 24 (->pin 18) / ground 20 + +When button is pressed : button.value -> False + + +''' + +from time import sleep +import board +import digitalio +import leds + +crtfunc = 0 +funcs = [0,1,2] + +debug = 0 + +print("Loading Nerves buttons handler v0.1b") + +funcbutton = digitalio.DigitalInOut(board.D23) +funcbutton.direction = digitalio.Direction.INPUT +funcbutton.pull = digitalio.Pull.UP + +funcstate = True + +downbutton = digitalio.DigitalInOut(board.D24) +downbutton.direction = digitalio.Direction.INPUT +downbutton.pull = digitalio.Pull.UP + +def runforever(): + global crtfunc, funcstate + + while True: + + #print(funcbutton.value, funcstate, crtfunc, downbutton.value) + #print(funcbutton.value, funcstate) + + if not funcbutton.value: + + if debug > 0: + print("func button pressed : ", funcbutton.value, funcstate ) + + sleep(0.2) + + # Launch on button release + if funcbutton.value and funcstate == False : + + crtfunc +=1 + if crtfunc == len(funcs): + crtfunc = 0 + print('Launch func', crtfunc) + if crtfunc == 0: + leds.mode = 0 + if crtfunc == 1: + leds.mode = 1 + + sleep(0.2) + + funcstate = funcbutton.value + + if not downbutton.value: + if debug > 0: + print("down button pressed") + + import os + print('will shutdown...') + leds.mode = -1 + leds.cls() + os.system("systemctl poweroff") + + sleep(0.005) + + +if __name__ == '__main__': + + runforever() \ No newline at end of file diff --git a/cls.py b/cls.py new file mode 100644 index 0000000..bacdf69 --- /dev/null +++ b/cls.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +''' + + +SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +SPDX-License-Identifier: MIT + +''' + +# Simple test for NeoPixels on Raspberry Pi +import time +import board +import neopixel + + +# Choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D18 +# NeoPixels must be connected to D10, D12, D18 or D21 to work. +pixel_pin = board.D18 + +# The number of NeoPixels +num_pixels = 14 + +# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed! +# For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW. +ORDER = neopixel.GRB + +pixels = neopixel.NeoPixel( + pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER +) + +def cls(): + + print('Cls') + pixels.fill((0, 0, 0)) + pixels.show() + + +if __name__ == '__main__': + + cls() diff --git a/cls.sh b/cls.sh new file mode 100644 index 0000000..5ebbbc6 --- /dev/null +++ b/cls.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo python3 /home/pi/nerves/cls.py \ No newline at end of file diff --git a/down.sh b/down.sh new file mode 100644 index 0000000..d3835a9 --- /dev/null +++ b/down.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo shutdown -h now \ No newline at end of file diff --git a/leds.py b/leds.py index 64abbf6..b26b73e 100644 --- a/leds.py +++ b/leds.py @@ -1,16 +1,18 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - - ''' -sudo aot install python3-pip -sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel -sudo python3 -m pip install --force-reinstall adafruit-blinka +Neopixel GPIO D18 #(-> pin 12) +Ground pin 9 +5 V pin 4 + +Modes : + +-1 cls +0 Scappy +1 Rainbow -SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries -SPDX-License-Identifier: MIT ''' @@ -22,11 +24,31 @@ import neopixel # Choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D18 # NeoPixels must be connected to D10, D12, D18 or D21 to work. -pixel_pin = board.D18 +pixel_pin = board.D18 #(-> pin 12) # The number of NeoPixels -num_pixels = 6 +num_pixels = 14 +palette = [(0,0,0), + (255,0,0), + (0,255,0), + (0,0,255), + (255,255,0), + (0,255,255), + (255,0,255), + (192,192,192), + (128,128,128), + (128,0,0), + (128,128,0), + (0,128,0), + (128,0,128), + (0,128,128), + (0,0,128) + ] + +nbcolor = len(palette) +#print(nbcolor, "colors") +#print(palette) # The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed! # For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW. ORDER = neopixel.GRB @@ -35,6 +57,8 @@ pixels = neopixel.NeoPixel( pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER ) +# mode 0 : scapy +mode = 0 def wheel(pos): # Input a value 0 to 255 to get a color value. @@ -57,18 +81,57 @@ def wheel(pos): b = int(255 - pos * 3) return (r, g, b) if ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0) - +# rainbow demo def rainbow_cycle(wait): - for j in range(255): - for i in range(num_pixels): - pixel_index = (i * 256 // num_pixels) + j - pixels[i] = wheel(pixel_index & 255) - pixels.show() - time.sleep(wait) + + if mode == 1: + for j in range(255): + for i in range(num_pixels): + pixel_index = (i * 256 // num_pixels) + j + pixels[i] = wheel(pixel_index & 255) + pixels.show() + time.sleep(wait) + +# rainbow mode +def rainbow_mode(wait = 0.001): + + if mode == 1: + for j in range(255): + for i in range(num_pixels): + pixel_index = (i * 256 // num_pixels) + j + pixels[i] = wheel(pixel_index & 255) + pixels.show() + time.sleep(wait) + +def cls(): + + print('Cls') + mode = -1 + pixels.fill((0, 0, 0)) + pixels.show() + +def ledscls(): + + print('Cls') + pixels.fill((0, 0, 0)) + pixels.show() + +def display(colors): + + print("Incoming generated colors :",colors) + for pixel in range(num_pixels): + #print(pixel, colors[pixel], palette[colors[pixel]] ) + pixels[pixel] = palette[colors[pixel]] + #print("pixels array :",pixels) + pixels.show() -while True: +def demo(): + global mode + + ledscls() # Comment this line out if you have RGBW/GRBW NeoPixels + print("Demo.") pixels.fill((255, 0, 0)) # Uncomment this line if you have RGBW/GRBW NeoPixels # pixels.fill((255, 0, 0, 0)) @@ -89,4 +152,11 @@ while True: pixels.show() time.sleep(1) + mode = 1 rainbow_cycle(0.001) # rainbow cycle with 1ms delay per step + + ledscls() + +if __name__ == '__main__': + + demo() diff --git a/nerves.py b/nerves.py index c1938f9..1c9ebe3 100644 --- a/nerves.py +++ b/nerves.py @@ -5,8 +5,9 @@ Nerves v 0.1 -A termeal version with led strip on raspberry pi +A termeal version with fiber optics on raspberry pi +goes with leds mode 0 sniff packets from interface en0 using python module scapy (2.3.1) generate led color for bhoreal in usb midi mode depending on packet port number @@ -26,91 +27,205 @@ log.infog("Nerves") log.infog("v0.1b") print("Loading...") -from OSC3 import OSCClient, OSCMessage +import adafruit_blinka.agnostic as agnostic +import board +import sys + +print( + "Found system type: %s (sys.platform %s implementation %s) " + % (agnostic.board_id, sys.platform, sys.implementation.name) +) + from sys import platform from time import sleep import types import random from scapy.all import * +from threading import Thread +import traceback -import argparse - -argsparser = argparse.ArgumentParser(description="Nerves v0.1") -argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output") -args = argsparser.parse_args() - -verbose=args.verbose +import leds +import buttons +import ws -client = OSCClient() -msg = OSCMessage() +# from Adafruit_GPIO import Platform +# print("Platform = ", Platform.platform_detect(), Platform.pi_version()) + +#print("board contents: ", dir(board)) + + +nerves = [[0,7],[1,3],[2,9],[4,13],[5,11],[6,12],[8,10]] +influx = [0]*(len(nerves)*2) +print(influx) counter = 0 +import argparse +parser = argparse.ArgumentParser(description="A Scanner Interface Darkly") +parser.add_argument("-i","--interface", help="interface to scan") +parser.add_argument("-x","--xcol",help="number of columns (8 by default)",type=int) +parser.add_argument("-y","--ycol",help="number of rows (8 by default)",type=int) +parser.add_argument("-f","--filter",help="tcpdump filter") +parser.add_argument("-c","--color",help="number of color",type=int) +parser.add_argument("-d","--display",help="type of side display",choices=["colors", "ports"]) +parser.add_argument("-epi","--ephemeralportmin",help="ephemeral port min to exclude (32768 by default), set to 65536 to include all ports",type=int) +parser.add_argument("-epa","--ephemeralportmax",help="ephemeral port max to exclude (61000 by default)",type=int) +args = parser.parse_args() + +if args.xcol: + xmax=args.xcol +else: + xmax=8 + +if args.ycol: + ymax=args.ycol +else: + ymax=8 + +if args.color: + nbcolor=args.color +else: + nbcolor=15 + +if args.display: + sidedisplay=args.display +else: + sidedisplay="ports" + +if args.ephemeralportmin: + ephemeralportmin = args.ephemeralportmin +else: + ephemeralportmin = 32768 + +if args.ephemeralportmax: + ephemeralportmax = args.ephemeralportmax +else: + ephemeralportmax = 61000 + + def sendled(zzzport): global counter - zzz = zzzport % 127 - # zzz = led color - msg = OSCMessage() - msg.setAddress("/bhoreal/in") - msg.append(counter) - msg.append(zzz) - try: - client.sendto(msg, ('127.0.0.1', 9002)) - msg.clearData() - except: - print('Connection refused') - pass - sleep(0.001) - counter += 1 - if counter > 63: + #print("nerve",counter) + zzz = zzzport % leds.nbcolor # zzz = led color + + influx[nerves[counter][0]] = zzz + influx[nerves[counter][1]] = zzz + #print("nerve",counter,"influx", influx) + + leds.display(influx) + + #print(len(nerves), "nerves") + if counter +1 == len(nerves): counter = 0 - - + else: + counter += 1 + #print("next nerve", counter) def print_summary(pkt): - if IP in pkt: - ip_src=pkt[IP].src - ip_dst=pkt[IP].dst - - - if TCP in pkt: - tcp_sport=pkt[TCP].sport - tcp_dport=pkt[TCP].dport - if tcp_sport < 50000: - print (" IP src " + str(ip_src) + " TCP sport " + str(tcp_sport) ) - sendled(tcp_sport) - if tcp_dport < 50000: - print (" IP dst " + str(ip_dst) + " TCP dport " + str(tcp_dport)) - sendled(tcp_dport) - if UDP in pkt: - udp_sport=pkt[UDP].sport - udp_dport=pkt[UDP].dport + if leds.mode == 0: - if udp_sport < 50000: - print (" IP src " + str(ip_src) + " UDP sport " + str(udp_sport) ) - sendled(udp_sport) + if IP in pkt: + ip_src=pkt[IP].src + ip_dst=pkt[IP].dst - if udp_dport < 50000: - print (" IP dst " + str(ip_dst) + " UDP dport " + str(udp_dport)) - sendled(udp_dport) + + if TCP in pkt: + tcp_sport=pkt[TCP].sport + tcp_dport=pkt[TCP].dport + + if tcp_sport < 50000: + print (" IP src " + str(ip_src) + " TCP sport " + str(tcp_sport) ) + sendled(tcp_sport) + if tcp_dport < 50000: + print (" IP dst " + str(ip_dst) + " TCP dport " + str(tcp_dport)) + sendled(tcp_dport) + + if UDP in pkt: + udp_sport=pkt[UDP].sport + udp_dport=pkt[UDP].dport + + if udp_sport < 50000: + print (" IP src " + str(ip_src) + " UDP sport " + str(udp_sport) ) + sendled(udp_sport) + + if udp_dport < 50000: + print (" IP dst " + str(ip_dst) + " UDP dport " + str(udp_dport)) + sendled(udp_dport) - if ARP in pkt and pkt[ARP].op in (1,2): - print (" ARP") - sendled(67) + if ARP in pkt and pkt[ARP].op in (1,2): + print (" ARP") + sendled(67) def handle_error(self,request,client_address): # All callbacks pass +''' +def main(): + + print("Testing leds...") + leds.cls() + leds.demo() + leds.cls() + if platform == 'darwin': - sniff(iface='en0', prn=print_summary, store=0) + print("Running on", platform, "-> en0") + #sniff(iface='en0', prn=print_summary, store=0) + sniff(iface='en0', prn=print_summary, store=0,filter=args.filter) + else: + print("Running on", platform, "-> eth0") sniff(iface='eth0', prn=print_summary, store=0) +''' + +def main(): + + ws.Start(ws.serverIP, ws.wsPORT) + + try: + + ws_thread = Thread(target=ws.runforever, args=()) + ws_thread.setDaemon(True) + ws_thread.start() + + print("Launching buttons thread...") + buttons_thread = Thread(target=buttons.runforever, args=()) + buttons_thread.setDaemon(True) + buttons_thread.start() + + ws.sendWSall("/players Demo") + print("Testing leds...") + leds.cls() + leds.demo() + leds.cls() + + # Start sniffing + leds.mode = 0 + ws.sendWSall("/players Sniffing") + if platform == 'darwin': + print("Running on", platform, "-> en0") + #sniff(iface='en0', prn=print_summary, store=0) + sniff(iface='en0', prn=print_summary, store=0,filter=args.filter) + + else: + print("Running on", platform, "-> eth0") + sniff(iface='eth0', prn=print_summary, store=0) + except Exception: + traceback.print_exc() + + finally: + + ws_thread.join() + buttons_thread.join() + +if __name__ == '__main__': + + main() diff --git a/websocket_server.py b/websocket_server.py new file mode 100755 index 0000000..9d1af5c --- /dev/null +++ b/websocket_server.py @@ -0,0 +1,371 @@ +# Author: Johan Hanssen Seferidis +# License: MIT + +import sys +import struct +from base64 import b64encode +from hashlib import sha1 +import logging +from socket import error as SocketError +import errno + +if sys.version_info[0] < 3: + from SocketServer import ThreadingMixIn, TCPServer, StreamRequestHandler +else: + from socketserver import ThreadingMixIn, TCPServer, StreamRequestHandler + +logger = logging.getLogger(__name__) +logging.basicConfig() + +''' ++-+-+-+-+-------+-+-------------+-------------------------------+ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-------+-+-------------+-------------------------------+ +|F|R|R|R| opcode|M| Payload len | Extended payload length | +|I|S|S|S| (4) |A| (7) | (16/64) | +|N|V|V|V| |S| | (if payload len==126/127) | +| |1|2|3| |K| | | ++-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + +| Extended payload length continued, if payload len == 127 | ++ - - - - - - - - - - - - - - - +-------------------------------+ +| Payload Data continued ... | ++---------------------------------------------------------------+ +''' + +FIN = 0x80 +OPCODE = 0x0f +MASKED = 0x80 +PAYLOAD_LEN = 0x7f +PAYLOAD_LEN_EXT16 = 0x7e +PAYLOAD_LEN_EXT64 = 0x7f + +OPCODE_CONTINUATION = 0x0 +OPCODE_TEXT = 0x1 +OPCODE_BINARY = 0x2 +OPCODE_CLOSE_CONN = 0x8 +OPCODE_PING = 0x9 +OPCODE_PONG = 0xA + + +# -------------------------------- API --------------------------------- + +class API(): + + def run_forever(self): + try: + logger.info("Listening on port %d for clients.." % self.port) + self.serve_forever() + except KeyboardInterrupt: + self.server_close() + logger.info("Server terminated.") + except Exception as e: + logger.error(str(e), exc_info=True) + exit(1) + + def new_client(self, client, server): + pass + + def client_left(self, client, server): + pass + + def message_received(self, client, server, message): + pass + + def set_fn_new_client(self, fn): + self.new_client = fn + + def set_fn_client_left(self, fn): + self.client_left = fn + + def set_fn_message_received(self, fn): + self.message_received = fn + + def send_message(self, client, msg): + self._unicast_(client, msg) + + def send_message_to_all(self, msg): + self._multicast_(msg) + + +# ------------------------- Implementation ----------------------------- + +class WebsocketServer(ThreadingMixIn, TCPServer, API): + """ + A websocket server waiting for clients to connect. + + Args: + port(int): Port to bind to + host(str): Hostname or IP to listen for connections. By default 127.0.0.1 + is being used. To accept connections from any client, you should use + 0.0.0.0. + loglevel: Logging level from logging module to use for logging. By default + warnings and errors are being logged. + + Properties: + clients(list): A list of connected clients. A client is a dictionary + like below. + { + 'id' : id, + 'handler' : handler, + 'address' : (addr, port) + } + """ + + allow_reuse_address = True + daemon_threads = True # comment to keep threads alive until finished + + clients = [] + id_counter = 0 + + def __init__(self, port, host='127.0.0.1', loglevel=logging.WARNING): + logger.setLevel(loglevel) + TCPServer.__init__(self, (host, port), WebSocketHandler) + self.port = self.socket.getsockname()[1] + + def _message_received_(self, handler, msg): + self.message_received(self.handler_to_client(handler), self, msg) + + def _ping_received_(self, handler, msg): + handler.send_pong(msg) + + def _pong_received_(self, handler, msg): + pass + + def _new_client_(self, handler): + self.id_counter += 1 + client = { + 'id': self.id_counter, + 'handler': handler, + 'address': handler.client_address + } + self.clients.append(client) + self.new_client(client, self) + + def _client_left_(self, handler): + client = self.handler_to_client(handler) + self.client_left(client, self) + if client in self.clients: + self.clients.remove(client) + + def _unicast_(self, to_client, msg): + to_client['handler'].send_message(msg) + + def _multicast_(self, msg): + for client in self.clients: + self._unicast_(client, msg) + + def handler_to_client(self, handler): + for client in self.clients: + if client['handler'] == handler: + return client + + +class WebSocketHandler(StreamRequestHandler): + + def __init__(self, socket, addr, server): + self.server = server + StreamRequestHandler.__init__(self, socket, addr, server) + + def setup(self): + StreamRequestHandler.setup(self) + self.keep_alive = True + self.handshake_done = False + self.valid_client = False + + def handle(self): + while self.keep_alive: + if not self.handshake_done: + self.handshake() + elif self.valid_client: + self.read_next_message() + + def read_bytes(self, num): + # python3 gives ordinal of byte directly + bytes = self.rfile.read(num) + if sys.version_info[0] < 3: + return map(ord, bytes) + else: + return bytes + + def read_next_message(self): + try: + b1, b2 = self.read_bytes(2) + except SocketError as e: # to be replaced with ConnectionResetError for py3 + if e.errno == errno.ECONNRESET: + logger.info("Client closed connection.") + print("Error: {}".format(e)) + self.keep_alive = 0 + return + b1, b2 = 0, 0 + except ValueError as e: + b1, b2 = 0, 0 + + fin = b1 & FIN + opcode = b1 & OPCODE + masked = b2 & MASKED + payload_length = b2 & PAYLOAD_LEN + + if opcode == OPCODE_CLOSE_CONN: + logger.info("Client asked to close connection.") + self.keep_alive = 0 + return + if not masked: + logger.warn("Client must always be masked.") + self.keep_alive = 0 + return + if opcode == OPCODE_CONTINUATION: + logger.warn("Continuation frames are not supported.") + return + elif opcode == OPCODE_BINARY: + logger.warn("Binary frames are not supported.") + return + elif opcode == OPCODE_TEXT: + opcode_handler = self.server._message_received_ + elif opcode == OPCODE_PING: + opcode_handler = self.server._ping_received_ + elif opcode == OPCODE_PONG: + opcode_handler = self.server._pong_received_ + else: + logger.warn("Unknown opcode %#x." % opcode) + self.keep_alive = 0 + return + + if payload_length == 126: + payload_length = struct.unpack(">H", self.rfile.read(2))[0] + elif payload_length == 127: + payload_length = struct.unpack(">Q", self.rfile.read(8))[0] + + masks = self.read_bytes(4) + message_bytes = bytearray() + for message_byte in self.read_bytes(payload_length): + message_byte ^= masks[len(message_bytes) % 4] + message_bytes.append(message_byte) + opcode_handler(self, message_bytes.decode('utf8')) + + def send_message(self, message): + self.send_text(message) + + def send_pong(self, message): + self.send_text(message, OPCODE_PONG) + + def send_text(self, message, opcode=OPCODE_TEXT): + """ + Important: Fragmented(=continuation) messages are not supported since + their usage cases are limited - when we don't know the payload length. + """ + + # Validate message + if isinstance(message, bytes): + message = try_decode_UTF8(message) # this is slower but ensures we have UTF-8 + if not message: + logger.warning("Can\'t send message, message is not valid UTF-8") + return False + elif sys.version_info < (3,0) and (isinstance(message, str) or isinstance(message, unicode)): + pass + elif isinstance(message, str): + pass + else: + logger.warning('Can\'t send message, message has to be a string or bytes. Given type is %s' % type(message)) + return False + + header = bytearray() + payload = encode_to_UTF8(message) + payload_length = len(payload) + + # Normal payload + if payload_length <= 125: + header.append(FIN | opcode) + header.append(payload_length) + + # Extended payload + elif payload_length >= 126 and payload_length <= 65535: + header.append(FIN | opcode) + header.append(PAYLOAD_LEN_EXT16) + header.extend(struct.pack(">H", payload_length)) + + # Huge extended payload + elif payload_length < 18446744073709551616: + header.append(FIN | opcode) + header.append(PAYLOAD_LEN_EXT64) + header.extend(struct.pack(">Q", payload_length)) + + else: + raise Exception("Message is too big. Consider breaking it into chunks.") + return + + self.request.send(header + payload) + + def read_http_headers(self): + headers = {} + # first line should be HTTP GET + http_get = self.rfile.readline().decode().strip() + assert http_get.upper().startswith('GET') + # remaining should be headers + while True: + header = self.rfile.readline().decode().strip() + if not header: + break + head, value = header.split(':', 1) + headers[head.lower().strip()] = value.strip() + return headers + + def handshake(self): + headers = self.read_http_headers() + + try: + assert headers['upgrade'].lower() == 'websocket' + except AssertionError: + self.keep_alive = False + return + + try: + key = headers['sec-websocket-key'] + except KeyError: + logger.warning("Client tried to connect but was missing a key") + self.keep_alive = False + return + + response = self.make_handshake_response(key) + self.handshake_done = self.request.send(response.encode()) + self.valid_client = True + self.server._new_client_(self) + + @classmethod + def make_handshake_response(cls, key): + return \ + 'HTTP/1.1 101 Switching Protocols\r\n'\ + 'Upgrade: websocket\r\n' \ + 'Connection: Upgrade\r\n' \ + 'Sec-WebSocket-Accept: %s\r\n' \ + '\r\n' % cls.calculate_response_key(key) + + @classmethod + def calculate_response_key(cls, key): + GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' + hash = sha1(key.encode() + GUID.encode()) + response_key = b64encode(hash.digest()).strip() + return response_key.decode('ASCII') + + def finish(self): + self.server._client_left_(self) + + +def encode_to_UTF8(data): + try: + return data.encode('UTF-8') + except UnicodeEncodeError as e: + logger.error("Could not encode data to UTF-8 -- %s" % e) + return False + except Exception as e: + raise(e) + return False + + +def try_decode_UTF8(data): + try: + return data.decode('utf-8') + except UnicodeDecodeError: + return False + except Exception as e: + raise(e) diff --git a/ws.py b/ws.py new file mode 100644 index 0000000..bee6848 --- /dev/null +++ b/ws.py @@ -0,0 +1,216 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# -*- mode: Python -*- + +''' + +Nerves WS server v0.1b + +http page index.html get Server IP, Port from config.js + +''' + +#import socket +import types, json +import _thread, time + +from websocket_server import WebsocketServer +import argparse +import leds +import traceback + +debug = 1 +Players=0 +clientmode = False +broadcast = True + +# record current values +crtvalueMMO3 = [0] * 32 +crtfunc = 0 +funcs = [0,1,2] + + +print("") +print("Loading Nerves WS server v0.1b") +print ("Arguments parsing if needed...") +argsparser = argparse.ArgumentParser(description="Nerves experimental v0.1b help mode") +argsparser.add_argument("-i","--IP",help="IP to bind to (0.0.0.0 by default)", type=str) +argsparser.add_argument("-p","--port",help="Websocket port to bind to (8081 by default)", type=str) +args = argsparser.parse_args() +# Server name +if args.IP: + serverIP = args.IP +else: + serverIP = "0.0.0.0" + +# ORCA destination device +if args.port: + wsPORT = int(args.port) +else: + wsPORT = 8081 + + +def Start(serverIP, wsPORT): + global wserver + + print("Starting WS server ", serverIP, ":", wsPORT) + wserver = WebsocketServer(wsPORT,host=serverIP) + wserver.set_fn_new_client(new_client) + wserver.set_fn_client_left(client_left) + wserver.set_fn_message_received(message_received) + + +def runforever(): + + print("Running WS server...") + leds.mode = 0 + wserver.run_forever() + + +# Called for every WS client connecting (after handshake) +def new_client(client, wserver): + global Players + + + print("New WS client connected and was given id %d" % client['id']) + #sendWSall("/status Hello %d" % client['id']) + #if current == True: + # sendallcurrentccvalues("mmo3") + # sendallcurrentccvalues("ocs2") + + Players+=1 + sendWSall("/status Hello %d" %(client['id'])) + if Players > 1: + #sendWSall("/Players %d" %(Players)) + sendWSall("/players connected:%d" %(Players)) + else: + sendWSall("/players connected:%d" %(Players)) + + + +# Called for every WS client disconnecting +def client_left(client, wserver): + + + try: + print("WS Client(%d) disconnected" % client['id']) + Players-=1 + sendWSall("/players %d" %(Players)) + except: + print("Something weird if coming from",client,"on the wire...") + pass + + +# Called for each WS received message. +def message_received(client, wserver, message): + global crtfunc + + print("") + if len(message) > 200: + message = message[:200]+'..' + + wspath = message.split(" ") + if debug > 0: + print("Main got from WS", client['id'], "said :", message, "splitted in an wspath :", wspath) + else: + print("Main got WS Client", client['id'], "said :", message) + + wscommand = wspath[0].split("/") + + # debug + if debug > 0: + print("wscommand :",wscommand) + + # noarg + if len(wspath) == 1: + args[0] = "noargs" + #print "noargs command" + + # functions : /func 1 + elif wscommand[1] == "func": + if debug > 0: + print("func function with ", wspath[1]) + crtfunc +=1 + if crtfunc == len(funcs): + crtfunc = 0 + print('Launch func', crtfunc) + + sendWSall("/players Function:"+str(crtfunc)) + + # shutdown : /down 1 + elif wscommand[1] == "down": + + if wspath[1] == '1': + import os + print('will shutdown...') + leds.mode = -1 + leds.cls() + sendWSall("/players Stopping...") + os.system("systemctl poweroff") + + + # CC : /device/cc/2 127 + elif wscommand[2] == "cc": + ccvr=int(wscommand[3]) #cc variable + ccvl=int(wspath[1]) #cc value + if debug > 0: + print("ccvr=%d/ccvl=%d"%(ccvr,ccvl)) + if wscommand[1] == "ocs2": + crtvalueOCS2[ccvr]=ccvl + else: + crtvalueMMO3[ccvr]=ccvl + + # Loop back : WS Client -> server -> WS Client + #sendWSall(message) + +# Send through websocket. +# Different websocket library for client (websocket) or server (websocket_server. +# ws object is added here by main.py or client.py startup : midi3.ws = +def send(message): + + if clientmode == True: + send(message) + else: + wserver.send_message_to_all(msg = message) + + + +def sendWSall(message): + + if broadcast == True: + if debug >0: + print("WS sending to all %s" % (message)) + + wserver.send_message_to_all(message) + +# /send all current cc values +def sendallcurrentccvalues(nozoid): + + if broadcast == True: + #print "" + print("sending all current cc values of", nozoid) + + if nozoid == "mmo3": + for ccnumber in range(0,32): + sendWSall("/mmo3/cc/"+str(ccnumber)+" "+str(crtvalueMMO3[ccnumber])) + else: + for ccnumber in range(0,32): + sendWSall("/ocs2/cc/"+str(ccnumber)+" "+str(crtvalueOCS2[ccnumber])) + + +if __name__ == '__main__': + + Start(serverIP, wsPORT) + + try: + + runforever() + + except Exception: + traceback.print_exc() + + + + + + diff --git a/www/config.js b/www/config.js new file mode 100644 index 0000000..ca02a3c --- /dev/null +++ b/www/config.js @@ -0,0 +1 @@ +websocket_uri = "ws://192.168.2.189:8081/" diff --git a/www/css/7f37946c45abf5482c243bf326f82628.eot b/www/css/7f37946c45abf5482c243bf326f82628.eot new file mode 100755 index 0000000000000000000000000000000000000000..2b3667ede54e2682e89c50ff43279fc51aee01e4 GIT binary patch literal 45532 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 + + + +Created by FontForge 20120731 at Sat Jun 6 06:35:01 2020 + By www +This work is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 License (click below for details). +The font was created by Michal Sulik using Fony, bdfresize, potrace, autotrace and Fontforge. +If you use this font in any public work, please be so nice and leave a link in comments on http://msulik.deviantart.com/. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/css/7f37946c45abf5482c243bf326f82628.ttf b/www/css/7f37946c45abf5482c243bf326f82628.ttf new file mode 100755 index 0000000000000000000000000000000000000000..0e38d7b616da6ce2b43e0c80d1174ec4255e278a GIT binary patch literal 45304 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 + + + +Created by FontForge 20110222 at Mon Mar 7 11:46:57 2011 + By www-data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/css/LED.ttf b/www/css/LED.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ab6b07daa8dccf37bd8bf8ac225c7e1bfd312425 GIT binary patch literal 31420 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 AH2?qr literal 0 HcmV?d00001 diff --git a/www/css/LED.woff b/www/css/LED.woff new file mode 100644 index 0000000000000000000000000000000000000000..f0e1058903517ffed9ac11d6ffcb15610cbf58b7 GIT binary patch literal 12128 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�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 ih9V~uENxw14X34nAvYd8bRli{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\f95b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\f905"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\f95c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\f95d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\f95e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\f95f"}.fa-handshake-slash:before{content:"\f960"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\f961"}.fa-head-side-cough-slash:before{content:"\f962"}.fa-head-side-mask:before{content:"\f963"}.fa-head-side-virus:before{content:"\f964"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\f965"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\f966"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\f967"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\f968"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\f969"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\f96a"}.fa-pump-soap:before{content:"\f96b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\f96c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\f96e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\f96f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\f970"}.fa-store-slash:before{content:"\f971"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\f972"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\f974"}.fa-virus-slash:before{content:"\f975"}.fa-viruses:before{content:"\f976"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/www/css/fontawesome.css b/www/css/fontawesome.css new file mode 100644 index 0000000..c73d7c0 --- /dev/null +++ b/www/css/fontawesome.css @@ -0,0 +1,4522 @@ +/*! + * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fad, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical, +:root .fa-flip-both { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-acquisitions-incorporated:before { + content: "\f6af"; } + +.fa-ad:before { + content: "\f641"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adobe:before { + content: "\f778"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-air-freshener:before { + content: "\f5d0"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angry:before { + content: "\f556"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-ankh:before { + content: "\f644"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-alt:before { + content: "\f5d1"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-archway:before { + content: "\f557"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-atlas:before { + content: "\f558"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-atom:before { + content: "\f5d2"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-award:before { + content: "\f559"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-baby:before { + content: "\f77c"; } + +.fa-baby-carriage:before { + content: "\f77d"; } + +.fa-backspace:before { + content: "\f55a"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-bacon:before { + content: "\f7e5"; } + +.fa-bahai:before { + content: "\f666"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-balance-scale-left:before { + content: "\f515"; } + +.fa-balance-scale-right:before { + content: "\f516"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bezier-curve:before { + content: "\f55b"; } + +.fa-bible:before { + content: "\f647"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-biking:before { + content: "\f84a"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-biohazard:before { + content: "\f780"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blender:before { + content: "\f517"; } + +.fa-blender-phone:before { + content: "\f6b6"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blog:before { + content: "\f781"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-bone:before { + content: "\f5d7"; } + +.fa-bong:before { + content: "\f55c"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-book-dead:before { + content: "\f6b7"; } + +.fa-book-medical:before { + content: "\f7e6"; } + +.fa-book-open:before { + content: "\f518"; } + +.fa-book-reader:before { + content: "\f5da"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-border-all:before { + content: "\f84c"; } + +.fa-border-none:before { + content: "\f850"; } + +.fa-border-style:before { + content: "\f853"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-box-tissue:before { + content: "\f95b"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-brain:before { + content: "\f5dc"; } + +.fa-bread-slice:before { + content: "\f7ec"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-broadcast-tower:before { + content: "\f519"; } + +.fa-broom:before { + content: "\f51a"; } + +.fa-brush:before { + content: "\f55d"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-bus-alt:before { + content: "\f55e"; } + +.fa-business-time:before { + content: "\f64a"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-day:before { + content: "\f783"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-calendar-week:before { + content: "\f784"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-campground:before { + content: "\f6bb"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-candy-cane:before { + content: "\f786"; } + +.fa-cannabis:before { + content: "\f55f"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-car-alt:before { + content: "\f5de"; } + +.fa-car-battery:before { + content: "\f5df"; } + +.fa-car-crash:before { + content: "\f5e1"; } + +.fa-car-side:before { + content: "\f5e4"; } + +.fa-caravan:before { + content: "\f8ff"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-carrot:before { + content: "\f787"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cash-register:before { + content: "\f788"; } + +.fa-cat:before { + content: "\f6be"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chair:before { + content: "\f6c0"; } + +.fa-chalkboard:before { + content: "\f51b"; } + +.fa-chalkboard-teacher:before { + content: "\f51c"; } + +.fa-charging-station:before { + content: "\f5e7"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-double:before { + content: "\f560"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-cheese:before { + content: "\f7ef"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-church:before { + content: "\f51d"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-city:before { + content: "\f64f"; } + +.fa-clinic-medical:before { + content: "\f7f2"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-meatball:before { + content: "\f73b"; } + +.fa-cloud-moon:before { + content: "\f6c3"; } + +.fa-cloud-moon-rain:before { + content: "\f73c"; } + +.fa-cloud-rain:before { + content: "\f73d"; } + +.fa-cloud-showers-heavy:before { + content: "\f740"; } + +.fa-cloud-sun:before { + content: "\f6c4"; } + +.fa-cloud-sun-rain:before { + content: "\f743"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-cocktail:before { + content: "\f561"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-coins:before { + content: "\f51e"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dollar:before { + content: "\f651"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-medical:before { + content: "\f7f5"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-comments-dollar:before { + content: "\f653"; } + +.fa-compact-disc:before { + content: "\f51f"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-compress-alt:before { + content: "\f422"; } + +.fa-compress-arrows-alt:before { + content: "\f78c"; } + +.fa-concierge-bell:before { + content: "\f562"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-cookie:before { + content: "\f563"; } + +.fa-cookie-bite:before { + content: "\f564"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crop-alt:before { + content: "\f565"; } + +.fa-cross:before { + content: "\f654"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-crow:before { + content: "\f520"; } + +.fa-crown:before { + content: "\f521"; } + +.fa-crutch:before { + content: "\f7f7"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-dailymotion:before { + content: "\f952"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-democrat:before { + content: "\f747"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-dharmachakra:before { + content: "\f655"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-dice:before { + content: "\f522"; } + +.fa-dice-d20:before { + content: "\f6cf"; } + +.fa-dice-d6:before { + content: "\f6d1"; } + +.fa-dice-five:before { + content: "\f523"; } + +.fa-dice-four:before { + content: "\f524"; } + +.fa-dice-one:before { + content: "\f525"; } + +.fa-dice-six:before { + content: "\f526"; } + +.fa-dice-three:before { + content: "\f527"; } + +.fa-dice-two:before { + content: "\f528"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-digital-tachograph:before { + content: "\f566"; } + +.fa-directions:before { + content: "\f5eb"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-disease:before { + content: "\f7fa"; } + +.fa-divide:before { + content: "\f529"; } + +.fa-dizzy:before { + content: "\f567"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dog:before { + content: "\f6d3"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-door-closed:before { + content: "\f52a"; } + +.fa-door-open:before { + content: "\f52b"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-drafting-compass:before { + content: "\f568"; } + +.fa-dragon:before { + content: "\f6d5"; } + +.fa-draw-polygon:before { + content: "\f5ee"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drum:before { + content: "\f569"; } + +.fa-drum-steelpan:before { + content: "\f56a"; } + +.fa-drumstick-bite:before { + content: "\f6d7"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dumbbell:before { + content: "\f44b"; } + +.fa-dumpster:before { + content: "\f793"; } + +.fa-dumpster-fire:before { + content: "\f794"; } + +.fa-dungeon:before { + content: "\f6d9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-egg:before { + content: "\f7fb"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-open-text:before { + content: "\f658"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-equals:before { + content: "\f52c"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-ethernet:before { + content: "\f796"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-alt:before { + content: "\f424"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fan:before { + content: "\f863"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-faucet:before { + content: "\f905"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-feather:before { + content: "\f52d"; } + +.fa-feather-alt:before { + content: "\f56b"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-contract:before { + content: "\f56c"; } + +.fa-file-csv:before { + content: "\f6dd"; } + +.fa-file-download:before { + content: "\f56d"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-export:before { + content: "\f56e"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-import:before { + content: "\f56f"; } + +.fa-file-invoice:before { + content: "\f570"; } + +.fa-file-invoice-dollar:before { + content: "\f571"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-prescription:before { + content: "\f572"; } + +.fa-file-signature:before { + content: "\f573"; } + +.fa-file-upload:before { + content: "\f574"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-fill:before { + content: "\f575"; } + +.fa-fill-drip:before { + content: "\f576"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fingerprint:before { + content: "\f577"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-alt:before { + content: "\f7e4"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-firefox-browser:before { + content: "\f907"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-fish:before { + content: "\f578"; } + +.fa-fist-raised:before { + content: "\f6de"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flag-usa:before { + content: "\f74d"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-flushed:before { + content: "\f579"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-minus:before { + content: "\f65d"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-folder-plus:before { + content: "\f65e"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-font-awesome-logo-full:before { + content: "\f4e6"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frog:before { + content: "\f52e"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-frown-open:before { + content: "\f57a"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-funnel-dollar:before { + content: "\f662"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gas-pump:before { + content: "\f52f"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-ghost:before { + content: "\f6e2"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-gifts:before { + content: "\f79c"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-cheers:before { + content: "\f79f"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glass-martini-alt:before { + content: "\f57b"; } + +.fa-glass-whiskey:before { + content: "\f7a0"; } + +.fa-glasses:before { + content: "\f530"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-globe-africa:before { + content: "\f57c"; } + +.fa-globe-americas:before { + content: "\f57d"; } + +.fa-globe-asia:before { + content: "\f57e"; } + +.fa-globe-europe:before { + content: "\f7a2"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-gopuram:before { + content: "\f664"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-greater-than:before { + content: "\f531"; } + +.fa-greater-than-equal:before { + content: "\f532"; } + +.fa-grimace:before { + content: "\f57f"; } + +.fa-grin:before { + content: "\f580"; } + +.fa-grin-alt:before { + content: "\f581"; } + +.fa-grin-beam:before { + content: "\f582"; } + +.fa-grin-beam-sweat:before { + content: "\f583"; } + +.fa-grin-hearts:before { + content: "\f584"; } + +.fa-grin-squint:before { + content: "\f585"; } + +.fa-grin-squint-tears:before { + content: "\f586"; } + +.fa-grin-stars:before { + content: "\f587"; } + +.fa-grin-tears:before { + content: "\f588"; } + +.fa-grin-tongue:before { + content: "\f589"; } + +.fa-grin-tongue-squint:before { + content: "\f58a"; } + +.fa-grin-tongue-wink:before { + content: "\f58b"; } + +.fa-grin-wink:before { + content: "\f58c"; } + +.fa-grip-horizontal:before { + content: "\f58d"; } + +.fa-grip-lines:before { + content: "\f7a4"; } + +.fa-grip-lines-vertical:before { + content: "\f7a5"; } + +.fa-grip-vertical:before { + content: "\f58e"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-guitar:before { + content: "\f7a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-hamburger:before { + content: "\f805"; } + +.fa-hammer:before { + content: "\f6e3"; } + +.fa-hamsa:before { + content: "\f665"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-medical:before { + content: "\f95c"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-holding-water:before { + content: "\f4c1"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-middle-finger:before { + content: "\f806"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-sparkles:before { + content: "\f95d"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-hands-wash:before { + content: "\f95e"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-handshake-alt-slash:before { + content: "\f95f"; } + +.fa-handshake-slash:before { + content: "\f960"; } + +.fa-hanukiah:before { + content: "\f6e6"; } + +.fa-hard-hat:before { + content: "\f807"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hat-cowboy:before { + content: "\f8c0"; } + +.fa-hat-cowboy-side:before { + content: "\f8c1"; } + +.fa-hat-wizard:before { + content: "\f6e8"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-head-side-cough:before { + content: "\f961"; } + +.fa-head-side-cough-slash:before { + content: "\f962"; } + +.fa-head-side-mask:before { + content: "\f963"; } + +.fa-head-side-virus:before { + content: "\f964"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-headphones-alt:before { + content: "\f58f"; } + +.fa-headset:before { + content: "\f590"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heart-broken:before { + content: "\f7a9"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-helicopter:before { + content: "\f533"; } + +.fa-highlighter:before { + content: "\f591"; } + +.fa-hiking:before { + content: "\f6ec"; } + +.fa-hippo:before { + content: "\f6ed"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-holly-berry:before { + content: "\f7aa"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-horse:before { + content: "\f6f0"; } + +.fa-horse-head:before { + content: "\f7ab"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hospital-user:before { + content: "\f80d"; } + +.fa-hot-tub:before { + content: "\f593"; } + +.fa-hotdog:before { + content: "\f80f"; } + +.fa-hotel:before { + content: "\f594"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-house-damage:before { + content: "\f6f1"; } + +.fa-house-user:before { + content: "\f965"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-hryvnia:before { + content: "\f6f2"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-ice-cream:before { + content: "\f810"; } + +.fa-icicles:before { + content: "\f7ad"; } + +.fa-icons:before { + content: "\f86d"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-ideal:before { + content: "\f913"; } + +.fa-igloo:before { + content: "\f7ae"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-infinity:before { + content: "\f534"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-instagram-square:before { + content: "\f955"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jedi:before { + content: "\f669"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joint:before { + content: "\f595"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-journal-whills:before { + content: "\f66a"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-kaaba:before { + content: "\f66b"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-khanda:before { + content: "\f66d"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-kiss:before { + content: "\f596"; } + +.fa-kiss-beam:before { + content: "\f597"; } + +.fa-kiss-wink-heart:before { + content: "\f598"; } + +.fa-kiwi-bird:before { + content: "\f535"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-landmark:before { + content: "\f66f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laptop-code:before { + content: "\f5fc"; } + +.fa-laptop-house:before { + content: "\f966"; } + +.fa-laptop-medical:before { + content: "\f812"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-laugh:before { + content: "\f599"; } + +.fa-laugh-beam:before { + content: "\f59a"; } + +.fa-laugh-squint:before { + content: "\f59b"; } + +.fa-laugh-wink:before { + content: "\f59c"; } + +.fa-layer-group:before { + content: "\f5fd"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-less-than:before { + content: "\f536"; } + +.fa-less-than-equal:before { + content: "\f537"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-luggage-cart:before { + content: "\f59d"; } + +.fa-lungs:before { + content: "\f604"; } + +.fa-lungs-virus:before { + content: "\f967"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-mail-bulk:before { + content: "\f674"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-male:before { + content: "\f183"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marked:before { + content: "\f59f"; } + +.fa-map-marked-alt:before { + content: "\f5a0"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-marker:before { + content: "\f5a1"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-mask:before { + content: "\f6fa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-medal:before { + content: "\f5a2"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-meh-blank:before { + content: "\f5a4"; } + +.fa-meh-rolling-eyes:before { + content: "\f5a5"; } + +.fa-memory:before { + content: "\f538"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-menorah:before { + content: "\f676"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-meteor:before { + content: "\f753"; } + +.fa-microblog:before { + content: "\f91a"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-alt:before { + content: "\f3c9"; } + +.fa-microphone-alt-slash:before { + content: "\f539"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microscope:before { + content: "\f610"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mitten:before { + content: "\f7b5"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mixer:before { + content: "\f956"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill:before { + content: "\f0d6"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-money-bill-wave:before { + content: "\f53a"; } + +.fa-money-bill-wave-alt:before { + content: "\f53b"; } + +.fa-money-check:before { + content: "\f53c"; } + +.fa-money-check-alt:before { + content: "\f53d"; } + +.fa-monument:before { + content: "\f5a6"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-mortar-pestle:before { + content: "\f5a7"; } + +.fa-mosque:before { + content: "\f678"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mountain:before { + content: "\f6fc"; } + +.fa-mouse:before { + content: "\f8cc"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-mug-hot:before { + content: "\f7b6"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-network-wired:before { + content: "\f6ff"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-not-equal:before { + content: "\f53e"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-oil-can:before { + content: "\f613"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-om:before { + content: "\f679"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-otter:before { + content: "\f700"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-pager:before { + content: "\f815"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-paint-roller:before { + content: "\f5aa"; } + +.fa-palette:before { + content: "\f53f"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-parking:before { + content: "\f540"; } + +.fa-passport:before { + content: "\f5ab"; } + +.fa-pastafarianism:before { + content: "\f67b"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-peace:before { + content: "\f67c"; } + +.fa-pen:before { + content: "\f304"; } + +.fa-pen-alt:before { + content: "\f305"; } + +.fa-pen-fancy:before { + content: "\f5ac"; } + +.fa-pen-nib:before { + content: "\f5ad"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-pencil-ruler:before { + content: "\f5ae"; } + +.fa-penny-arcade:before { + content: "\f704"; } + +.fa-people-arrows:before { + content: "\f968"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-pepper-hot:before { + content: "\f816"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-percentage:before { + content: "\f541"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-person-booth:before { + content: "\f756"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-alt:before { + content: "\f879"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-square-alt:before { + content: "\f87b"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-photo-video:before { + content: "\f87c"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-pied-piper-square:before { + content: "\f91e"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-pizza-slice:before { + content: "\f818"; } + +.fa-place-of-worship:before { + content: "\f67f"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-plane-arrival:before { + content: "\f5af"; } + +.fa-plane-departure:before { + content: "\f5b0"; } + +.fa-plane-slash:before { + content: "\f969"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poll:before { + content: "\f681"; } + +.fa-poll-h:before { + content: "\f682"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-poo-storm:before { + content: "\f75a"; } + +.fa-poop:before { + content: "\f619"; } + +.fa-portrait:before { + content: "\f3e0"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-pray:before { + content: "\f683"; } + +.fa-praying-hands:before { + content: "\f684"; } + +.fa-prescription:before { + content: "\f5b1"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-project-diagram:before { + content: "\f542"; } + +.fa-pump-medical:before { + content: "\f96a"; } + +.fa-pump-soap:before { + content: "\f96b"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-quran:before { + content: "\f687"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-radiation:before { + content: "\f7b9"; } + +.fa-radiation-alt:before { + content: "\f7ba"; } + +.fa-rainbow:before { + content: "\f75b"; } + +.fa-random:before { + content: "\f074"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-receipt:before { + content: "\f543"; } + +.fa-record-vinyl:before { + content: "\f8d9"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-remove-format:before { + content: "\f87d"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-republican:before { + content: "\f75e"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-restroom:before { + content: "\f7bd"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-ring:before { + content: "\f70b"; } + +.fa-road:before { + content: "\f018"; } + +.fa-robot:before { + content: "\f544"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-route:before { + content: "\f4d7"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-ruler:before { + content: "\f545"; } + +.fa-ruler-combined:before { + content: "\f546"; } + +.fa-ruler-horizontal:before { + content: "\f547"; } + +.fa-ruler-vertical:before { + content: "\f548"; } + +.fa-running:before { + content: "\f70c"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-sad-cry:before { + content: "\f5b3"; } + +.fa-sad-tear:before { + content: "\f5b4"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-satellite:before { + content: "\f7bf"; } + +.fa-satellite-dish:before { + content: "\f7c0"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-school:before { + content: "\f549"; } + +.fa-screwdriver:before { + content: "\f54a"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-scroll:before { + content: "\f70e"; } + +.fa-sd-card:before { + content: "\f7c2"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-dollar:before { + content: "\f688"; } + +.fa-search-location:before { + content: "\f689"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-shapes:before { + content: "\f61f"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-shield-virus:before { + content: "\f96c"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shoe-prints:before { + content: "\f54b"; } + +.fa-shopify:before { + content: "\f957"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-shuttle-van:before { + content: "\f5b6"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-signature:before { + content: "\f5b7"; } + +.fa-sim-card:before { + content: "\f7c4"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-skating:before { + content: "\f7c5"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-skiing:before { + content: "\f7c9"; } + +.fa-skiing-nordic:before { + content: "\f7ca"; } + +.fa-skull:before { + content: "\f54c"; } + +.fa-skull-crossbones:before { + content: "\f714"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-slash:before { + content: "\f715"; } + +.fa-sleigh:before { + content: "\f7cc"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smile-beam:before { + content: "\f5b8"; } + +.fa-smile-wink:before { + content: "\f4da"; } + +.fa-smog:before { + content: "\f75f"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-smoking-ban:before { + content: "\f54d"; } + +.fa-sms:before { + content: "\f7cd"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowboarding:before { + content: "\f7ce"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-snowman:before { + content: "\f7d0"; } + +.fa-snowplow:before { + content: "\f7d2"; } + +.fa-soap:before { + content: "\f96e"; } + +.fa-socks:before { + content: "\f696"; } + +.fa-solar-panel:before { + content: "\f5ba"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-down-alt:before { + content: "\f881"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-alpha-up-alt:before { + content: "\f882"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-down-alt:before { + content: "\f884"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-amount-up-alt:before { + content: "\f885"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-down-alt:before { + content: "\f886"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-numeric-up-alt:before { + content: "\f887"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-spa:before { + content: "\f5bb"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-spell-check:before { + content: "\f891"; } + +.fa-spider:before { + content: "\f717"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-splotch:before { + content: "\f5bc"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-spray-can:before { + content: "\f5bd"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-square-root-alt:before { + content: "\f698"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-stamp:before { + content: "\f5bf"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-and-crescent:before { + content: "\f699"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-star-half-alt:before { + content: "\f5c0"; } + +.fa-star-of-david:before { + content: "\f69a"; } + +.fa-star-of-life:before { + content: "\f621"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-stopwatch-20:before { + content: "\f96f"; } + +.fa-store:before { + content: "\f54e"; } + +.fa-store-alt:before { + content: "\f54f"; } + +.fa-store-alt-slash:before { + content: "\f970"; } + +.fa-store-slash:before { + content: "\f971"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-stream:before { + content: "\f550"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-stroopwafel:before { + content: "\f551"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-suitcase-rolling:before { + content: "\f5c1"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-surprise:before { + content: "\f5c2"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-swatchbook:before { + content: "\f5c3"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-swimmer:before { + content: "\f5c4"; } + +.fa-swimming-pool:before { + content: "\f5c5"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-synagogue:before { + content: "\f69b"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-teeth:before { + content: "\f62e"; } + +.fa-teeth-open:before { + content: "\f62f"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-temperature-high:before { + content: "\f769"; } + +.fa-temperature-low:before { + content: "\f76b"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-tenge:before { + content: "\f7d7"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-theater-masks:before { + content: "\f630"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-tint-slash:before { + content: "\f5c7"; } + +.fa-tired:before { + content: "\f5c8"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-toilet:before { + content: "\f7d8"; } + +.fa-toilet-paper:before { + content: "\f71e"; } + +.fa-toilet-paper-slash:before { + content: "\f972"; } + +.fa-toolbox:before { + content: "\f552"; } + +.fa-tools:before { + content: "\f7d9"; } + +.fa-tooth:before { + content: "\f5c9"; } + +.fa-torah:before { + content: "\f6a0"; } + +.fa-torii-gate:before { + content: "\f6a1"; } + +.fa-tractor:before { + content: "\f722"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-traffic-light:before { + content: "\f637"; } + +.fa-trailer:before { + content: "\f941"; } + +.fa-train:before { + content: "\f238"; } + +.fa-tram:before { + content: "\f7da"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-trash-restore:before { + content: "\f829"; } + +.fa-trash-restore-alt:before { + content: "\f82a"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-monster:before { + content: "\f63b"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-truck-pickup:before { + content: "\f63c"; } + +.fa-tshirt:before { + content: "\f553"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-umbrella-beach:before { + content: "\f5ca"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-unity:before { + content: "\f949"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-alt:before { + content: "\f406"; } + +.fa-user-alt-slash:before { + content: "\f4fa"; } + +.fa-user-astronaut:before { + content: "\f4fb"; } + +.fa-user-check:before { + content: "\f4fc"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-clock:before { + content: "\f4fd"; } + +.fa-user-cog:before { + content: "\f4fe"; } + +.fa-user-edit:before { + content: "\f4ff"; } + +.fa-user-friends:before { + content: "\f500"; } + +.fa-user-graduate:before { + content: "\f501"; } + +.fa-user-injured:before { + content: "\f728"; } + +.fa-user-lock:before { + content: "\f502"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-minus:before { + content: "\f503"; } + +.fa-user-ninja:before { + content: "\f504"; } + +.fa-user-nurse:before { + content: "\f82f"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-shield:before { + content: "\f505"; } + +.fa-user-slash:before { + content: "\f506"; } + +.fa-user-tag:before { + content: "\f507"; } + +.fa-user-tie:before { + content: "\f508"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-users-cog:before { + content: "\f509"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-vector-square:before { + content: "\f5cb"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vihara:before { + content: "\f6a7"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-virus:before { + content: "\f974"; } + +.fa-virus-slash:before { + content: "\f975"; } + +.fa-viruses:before { + content: "\f976"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-voicemail:before { + content: "\f897"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-mute:before { + content: "\f6a9"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vote-yea:before { + content: "\f772"; } + +.fa-vr-cardboard:before { + content: "\f729"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-walking:before { + content: "\f554"; } + +.fa-wallet:before { + content: "\f555"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-water:before { + content: "\f773"; } + +.fa-wave-square:before { + content: "\f83e"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weight-hanging:before { + content: "\f5cd"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wind:before { + content: "\f72e"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-bottle:before { + content: "\f72f"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-wine-glass-alt:before { + content: "\f5ce"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yin-yang:before { + content: "\f6ad"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } diff --git a/www/css/newstyle.css b/www/css/newstyle.css new file mode 100644 index 0000000..f82c0e1 --- /dev/null +++ b/www/css/newstyle.css @@ -0,0 +1,165 @@ + .grid-container { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 0.8fr 47px 0.7fr 2.8fr; + grid-template-areas: ". . ." ". . ." ". . ." ". . ."; + } + .buttons-container { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 1fr; + grid-template-areas: ". . ." ". . ." ". . ." ". . ."; + } + #title{ + font-family: "Lucida Grande", Verdana, Arial, sans-serif; + text-align: center; + color: #ddd; + font-size: 3.3ex; + } + #text{ + font-family: "Lucida Grande", Verdana, Arial, sans-serif; + text-align: center; + color: #ccc; + font-size: 2ex; + } + #smalltext{ + font-family: "Lucida Grande", Verdana, Arial, sans-serif; + text-align: center; + color: #ccc; + font-size: 1.6ex; + } + .encoders{ + margin: 0 auto; + + } + .mainGrid { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; + grid-template-rows: 1fr; + gap: 1px 1px; + grid-template-areas: ". . . . . . . ."; + } + + .encodersGrid { + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr 1fr 1fr 1fr 1fr; + gap: 1px 1px; + grid-template-areas: "." "." "." "." "."; + } + .content{ + width : 880px; + padding : 10px 20px; + margin : 15px auto; + background-color: #000000; + background-image: linear-gradient(174deg, #222,#111); + border-radius: 20px; + border : #0b0b0b 2px solid; + -webkit-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72); + -moz-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72); + box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72); + } + .contentB{ + width : 880px; + padding : 10px 20px; + margin : 15px auto; + background-color: #000000; + background-image: linear-gradient(340deg, #000000 0%, #434343 374%); + border-radius: 20px; + border : #333 1px solid; + } + .content-title { + color : #ddd; + border : none; + margin-top : 15px; + padding-bottom : 0; + margin-bottom : 0; + background-color : inherit; + } + + .content-names { + padding : 10px; + padding-top : 0; + border : none; + box-shadow : none; + background-color : inherit; + } + .TopRackGrid { + display: grid; + grid-template-columns: 120px 600px 80px 80px; + grid-template-rows: 1fr; + gap: 1px 1px; + grid-template-areas: ". . . ."; + } + .webaudiobut{ + border-radius: 5px; + border : #222222 2px solid; + -webkit-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72); + -moz-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72); + box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72); + } + + h2 { + position: relative; + line-height: 3ex; + color: #666; + text-align: middle; + font-family: 'Lucida Grande', Verdana, Arial, sans-serif; + font-size: 1.7ex; + margin-top : 1px; + text-shadow: 2px 3px #000; + } + @font-face { + + font-family: "Bus Led Display Small"; + src: url("7f37946c45abf5482c243bf326f82628.eot"); /* IE9*/ + src: url("7f37946c45abf5482c243bf326f82628.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ + url("7f37946c45abf5482c243bf326f82628.woff2") format("woff2"), /* chrome、firefox */ + url("7f37946c45abf5482c243bf326f82628.woff") format("woff"), /* chrome、firefox */ + url("7f37946c45abf5482c243bf326f82628.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url("7f37946c45abf5482c243bf326f82628.svg#Bus Led Display Small") format("svg"); /* iOS 4.1- */ + } + + .busled{ + color: #ddd; + background: #090909; + font-family:"Bus Led Display Small" !important; + font-size:2em;font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.7px; + -moz-osx-font-smoothing: grayscale;} + .info { + background: #000; + width: 200px; + text-align: center; + vertical-align: middle; + height: 30px; + border: 2px solid #445; + font-family: 'Lucida Grande', Verdana, Arial, sans-serif; + color: #aaa; + font-size: 2ex; + } + .shade { + position: relative; + margin: -21px 0 0; + padding: 0; + display: block; + background: #00538F; + width: 100%; + height: 24px; + opacity: 0.25; + text-align: center; + } + .shadow { + -webkit-box-shadow: 4px 6px 14px -1px rgba(0,0,0,0.82); + -moz-box-shadow: 4px 6px 14px -1px rgba(0,0,0,0.82); + box-shadow: 4px 6px 14px -1px rgba(0,0,0,0.82); + } + a:link { + color: #bbb; + } + a:visited { + color: #999; + } + + diff --git a/www/css/style.css b/www/css/style.css new file mode 100755 index 0000000..613dcde --- /dev/null +++ b/www/css/style.css @@ -0,0 +1 @@ +* { box-sizing: border-box; } body {margin: 0;}.row{display:table;padding:10px;width:100%;}.cell{width:8%;display:table-cell;height:75px;}body, html{background-color:#1d1c25;margin:0;padding:0;}.range{-webkit-appearance:none;-moz-appearance:none;position:absolute;left:50%;top:50%;width:200px;margin-top:10px;transform:translate(-50%, -50%);}input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;background:linear-gradient(45deg, rgba(59,173,227,1) 0%, rgba(87,111,230,1) 25%, rgba(152,68,183,1) 51%, rgba(255,53,127,1) 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#3bade3 ', endColorstr='#ff357f ', GradientType=1 );height:2px;}input[type=range]:focus{outline:none;}input[type=range]::-moz-range-track{-moz-appearance:none;background:linear-gradient(45deg, rgba(59,173,227,1) 0%, rgba(87,111,230,1) 25%, rgba(152,68,183,1) 51%, rgba(255,53,127,1) 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#3bade3 ', endColorstr='#ff357f ', GradientType=1 );height:2px;}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:2px solid;border-radius:50%;height:25px;width:25px;max-width:80px;position:relative;bottom:11px;background-color:#1d1c25;cursor:-webkit-grab;-webkit-transition:border 1000ms ease;transition:border 1000ms ease;}input[type=range]::-moz-range-thumb{-moz-appearance:none;border:2px solid;border-radius:50%;height:25px;width:25px;max-width:80px;position:relative;bottom:11px;background-color:#1d1c25;cursor:-moz-grab;-moz-transition:border 1000ms ease;transition:border 1000ms ease;}.range.blue::-webkit-slider-thumb{border-color:rgb(59,173,227);}.range.ltpurple::-webkit-slider-thumb{border-color:rgb(87,111,230);}.range.purple::-webkit-slider-thumb{border-color:rgb(152,68,183);}.range.pink::-webkit-slider-thumb{border-color:rgb(255,53,127);}.range.blue::-moz-range-thumb{border-color:rgb(59,173,227);}.range.ltpurple::-moz-range-thumb{border-color:rgb(87,111,230);}.range.purple::-moz-range-thumb{border-color:rgb(152,68,183);}.range.pink::-moz-range-thumb{border-color:rgb(255,53,127);}input[type=range]::-webkit-slider-thumb:active{cursor:-webkit-grabbing;}input[type=range]::-moz-range-thumb:active{cursor:-moz-grabbing;}.range.blue{position:relative;background-color:rgba(31,27,27,0.09);width:75%;top:37.5px;}*{box-sizing:border-box;}body{margin:0;}#iy3nk{height:68px;}#il4ah{text-align:center;color:#ef4079;}#i7ox{font-family:Verdana, Geneva, sans-serif;color:#40acef;text-align:left;}#io5q{color:#40acef;}#iy2eh{text-align:center;}#i8a73{text-align:center;color:#4540ef;}#i3fzo{text-align:center;color:#7740ef;}#ikbjg{text-align:center;color:#b140ef;}@media (max-width: 768px){.cell{width:100%;display:block;}} \ No newline at end of file diff --git a/www/css/style2.css b/www/css/style2.css new file mode 100755 index 0000000..115c94b --- /dev/null +++ b/www/css/style2.css @@ -0,0 +1 @@ +input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;background:linear-gradient(45deg, rgba(59,173,227,1) 0%, rgba(87,111,230,1) 25%, rgba(152,68,183,1) 51%, rgba(255,53,127,1) 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#3bade3 ', endColorstr='#ff357f ', GradientType=1 );height:2px;}input[type=range]:focus{outline:none;}input[type=range]::-moz-range-track{-moz-appearance:none;background:linear-gradient(45deg, rgba(59,173,227,1) 0%, rgba(87,111,230,1) 25%, rgba(152,68,183,1) 51%, rgba(255,53,127,1) 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#3bade3 ', endColorstr='#ff357f ', GradientType=1 );height:2px;}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:2px solid;border-radius:50%;height:25px;width:25px;max-width:80px;position:relative;bottom:11px;background-color:#1d1c25;cursor:-webkit-grab;-webkit-transition:border 1000ms ease;transition:border 1000ms ease;}input[type=range]::-moz-range-thumb{-moz-appearance:none;border:2px solid;border-radius:50%;height:25px;width:25px;max-width:80px;position:relative;bottom:11px;background-color:#1d1c25;cursor:-moz-grab;-moz-transition:border 1000ms ease;transition:border 1000ms ease;}.range.blue::-webkit-slider-thumb{border-color:rgb(59,173,227);}.range.ltpurple::-webkit-slider-thumb{border-color:rgb(87,111,230);}.range.purple::-webkit-slider-thumb{border-color:rgb(152,68,183);}.range.pink::-webkit-slider-thumb{border-color:rgb(255,53,127);}.range.blue::-moz-range-thumb{border-color:rgb(59,173,227);}.range.ltpurple::-moz-range-thumb{border-color:rgb(87,111,230);}.range.purple::-moz-range-thumb{border-color:rgb(152,68,183);}.range.pink::-moz-range-thumb{border-color:rgb(255,53,127);}input[type=range]::-webkit-slider-thumb:active{cursor:-webkit-grabbing;}input[type=range]::-moz-range-thumb:active{cursor:-moz-grabbing;}.range.blue{position:relative;background-color:rgba(31,27,27,0.09);width:75%;top:37.5px;}body{margin:0;}#iy3nk{font-family: "Lucida Grande", Verdana, Arial, sans-serif; font-size: 10ex; height:68px;}#il4ah{text-align:center;color:#ef4079;}#i7ox{font-family:Verdana, Geneva, sans-serif;color:#40acef;text-align:left;}#io5q{color:#40acef;}#iy2eh{text-align:center;}#i8a73{text-align:center;color:#4540ef;}#i3fzo{text-align:center;color:#7740ef;}#ikbjg{text-align:center;color:#b140ef;}@media (max-width: 768px){} \ No newline at end of file diff --git a/www/index.html b/www/index.html new file mode 100644 index 0000000..e33e82d --- /dev/null +++ b/www/index.html @@ -0,0 +1,313 @@ + + + + Nerves + + + + + + + + + + + + + + + + + + + + +
+
+
+

+ Nerves +

+ + +
+
+
+ Nerves +
+
+ 0 Connected +
+
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/www/knobs/cls.png b/www/knobs/cls.png new file mode 100644 index 0000000000000000000000000000000000000000..b92e506cbd6dcdb75ec1a00bc771c2b9b4de0f98 GIT binary patch literal 2804 zcmaJ@2~<LHS$pqu?mcI{^(w+cgADa8 z^+6zzAvKs3shs1L&v{)9<=ffvf@%Uw$gz?rL5d`cDFQ$NY(X*rq4JoiKqSCq=Vbf< zc!NM14qSSyB$gIJUZPu zhM)_49>zXA_hHJV3&PWb@MbVnVhL^t~=YxmLO1P{@0T zB+UoHf=umlti@?k)g z(M0SNLL`auA(nFI1La60LINC~m6Zj{Lc;{2R5%ik$E!3@D0d~oU7W+0FtgqHV*8H@ zBtXm(afK4DfDchAGLr?F5+A5C)4z_u6MmBAi$7eG^1|TROd%WzL#U4Q5lEx`e<+Xl z2`!dH0)OZGKZV8g93cRY1jK?&5ldOP6nj-DA%Q3Ym=b}AE)b-Dyv1;iKq3%x1VRWg z3JYFh4fi2T$v19RoZ`)`lCzPKdR-Y##L@UwLZXC_Pa>g*oWCKFM~kprr{xUvXhfj zMn;B_k-?TNBp3|Z(2$|2saa8x0);{iRYPA*P0heS*UimNQ&R&B20J_3>gnmAP$+F} zO#lEK9j!w`Lf~+FC=?tX?yaMvWoBj;8yjeByecj(PA21og?VXcsB^ho9L}YnpkUoP z6McOh7z}1=y1KTOXJ%#`7Z)fNZ>CT%ZEbDC!`0Eze&*)J91g9tlgyLq#}uC6wV^#vGgN+4`(Y7*z><}#VVetv#(xv;u= zTV-Xci_3Z&8}pD5ysfSI-n|*FuIsI>&1!1WwrvYrzuv;iYApn^uDl%BzJ04y8e3e< z+_NX$#KbT(lu%NVOsCV6l7b5g5(5Gdc)V+0U%8(jTuV!{y*+Qo4u(Jwg+@D-m6he> z#J99$`S`f6S+l07C@C{DrmL%X(TAJ3^3xWCCnxKjJ6Yd+Bdx3BD-=22-tG+z4W6E^ zJw2ru%!anM+=K*ja4=RTlSM>$r=^9br-#SH1dvE*sZ`q7DAv={TUl9AeJm}m5aS^V%m$#)gOxe_aO`>Qu*WW0S_d-5qgF zeLpv19}hiSN-jutymhvA_6yWx{;yYbnnx~s8HrPVpU#`}e`-AmL0Bq~|FlKWxC3y* zWPq5~w%k6LSUDYmt<~pTON%=k`P=HI5`;|zFd?9O4=?{ou^X89W3+*0*m^Gj)cXCs?uR?Bk}hW1*NN0j>%G;D zd05iolGCY)<7xJw`FmuN$w^briI%`TkUweMb*FW4BIBqIh%{f?(;L4Qwg2woY#xZd z)|OR2ymix_rAKtC|61+!vFzuap#Lt(Kg;uey)waRKD+Ja^|T7uQ%Gtt+sv^8uEQ>tH91BKE%vF1b2s@W-@g zPRefPKs&1C`tv(PxwFej!>>zDr2OJL^84h@<;1nT@PVry&7|db3s+z5eR}fn*>;N- z$LSG`ub7%g4B(nS?y|eHko~>$($=gd&e>MSX~@)FbhEE4_j-)$>Hglm=xr+J-O^a% z*&)TWpk{F4QqpqL>};P-+zR;ARXN;9RHPi@A(5_fisHJnZ7H)Zkn}m?yTW4~@*D zZol(wmmN)MwN^YC!!5pj9lEsxzp7<_0(@?I|GwbU=Lqc!=TV+w-ptPOP;k}J_(8T^ zBYODGf;b-4N-(b_i@ec9`^fzWmg24#s3cF)GiCoSCw>-Fl4k z91DBpn6Qm_jN@6BpKaf7eABE#elfrEAkA0hW2{`aSQRHD8+2Z|8@Au(hwiN7$cltPbv`-@iSc;h)mJ}ZZV>$g0zf)#hz0cQ6i&Rdsv#I7{ht(hWqYw!*2~APj z!*A`ZCVb{P#cRVQFHXJ^p79aI;?gV8RiVWy>%jJ@ltbOQ_@%|S8D#W>g{MYXW_xkYhN?= z8T6A!#LfFIi3AZjr!B?7G%cm*wS=czP@9aQus)dtdEZY>8?@OH-tUq%AEf#ZrIJHQM+1|J{{u$2WElVe literal 0 HcmV?d00001 diff --git a/www/knobs/down2.png b/www/knobs/down2.png new file mode 100644 index 0000000000000000000000000000000000000000..2432cd43cc5fde1bc866f153da46881d4ff75446 GIT binary patch literal 4093 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 B{XGBx literal 0 HcmV?d00001 diff --git a/www/knobs/funcs.png b/www/knobs/funcs.png new file mode 100644 index 0000000000000000000000000000000000000000..2f30b9f900f92fa885bc0ec2fbd9494badf546c9 GIT binary patch literal 5101 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 E0M_oA?f?J) literal 0 HcmV?d00001 diff --git a/www/touch-icon-iphone-retina-ocs2.png b/www/touch-icon-iphone-retina-ocs2.png new file mode 100644 index 0000000000000000000000000000000000000000..fa955a41961e376652ef0929bff52ec3db4b6aae GIT binary patch literal 9108 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 literal 0 HcmV?d00001 diff --git a/www/webaudio-controls.js b/www/webaudio-controls.js new file mode 100755 index 0000000..d9fdb43 --- /dev/null +++ b/www/webaudio-controls.js @@ -0,0 +1,1875 @@ +/* * + * + * WebAudio-Controls is based on + * webaudio-knob by Eiji Kitamura http://google.com/+agektmr + * webaudio-slider by RYoya Kawai https://plus.google.com/108242669191458983485/posts + * webaudio-switch by Keisuke Ai http://d.hatena.ne.jp/aike/ + * Integrated and enhanced by g200kg http://www.g200kg.com/ + * + * Copyright 2013 Eiji Kitamura / Ryoya KAWAI / Keisuke Ai / g200kg(Tatsuya Shinyagaito) + * + * 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. + * + * */ +if(window.customElements){ + let styles=document.createElement("style"); + styles.innerHTML= +`#webaudioctrl-context-menu { + display: none; + position: absolute; + z-index: 10; + padding: 0; + width: 100px; + color:#eee; + background-color: #268; + border: solid 1px #888; + box-shadow: 1px 1px 2px #888; + font-family: sans-serif; + font-size: 11px; + line-height:1.7em; + text-align:center; + cursor:pointer; + color:#fff; + list-style: none; +} +#webaudioctrl-context-menu.active { + display: block; +} +.webaudioctrl-context-menu__item { + display: block; + margin: 0; + padding: 0; + color: #000; + background-color:#eee; + text-decoration: none; +} +.webaudioctrl-context-menu__title{ + font-weight:bold; +} +.webaudioctrl-context-menu__item:last-child { + margin-bottom: 0; +} +.webaudioctrl-context-menu__item:hover { + background-color: #b8b8b8; +} +`; + document.head.appendChild(styles); + let midimenu=document.createElement("ul"); + midimenu.id="webaudioctrl-context-menu"; + midimenu.innerHTML= +`
  • MIDI Learn
  • +
  • Learn
  • +
  • Clear
  • +
  • Close
  • +`; + let opt={ + useMidi:0, + midilearn:0, + mididump:0, + outline:0, + knobSrc:null, + knobSprites:0, + knobWidth:0, + knobHeight:0, + knobDiameter:64, + knobColors:"#e00;#000;#000", + sliderSrc:null, + sliderKnobsrc:null, + sliderWidth:0, + sliderHeight:0, + sliderKnobwidth:0, + sliderKnobheight:0, + sliderDitchlength:0, + sliderColors:"#e00;#000;#fcc", + switchWidth:0, + switchHeight:0, + switchDiameter:24, + switchColors:"#e00;#000;#fcc", + paramWidth:32, + paramHeight:16, + paramColors:"#fff;#000", + xypadColors:"#e00;#000;#fcc", + }; + if(window.WebAudioControlsOptions) + Object.assign(opt,window.WebAudioControlsOptions); + class WebAudioControlsWidget extends HTMLElement{ + constructor(){ + super(); + this.addEventListener("keydown",this.keydown); + this.addEventListener("mousedown",this.pointerdown,{passive:false}); + this.addEventListener("touchstart",this.pointerdown,{passive:false}); + this.addEventListener("wheel",this.wheel); + this.addEventListener("mouseover",this.pointerover); + this.addEventListener("mouseout",this.pointerout); + this.addEventListener("contextmenu",this.contextMenu); + this.hover=this.drag=0; + document.body.appendChild(midimenu); + this.basestyle=` +.webaudioctrl-tooltip{ + display:inline-block; + position:absolute; + margin:0 -1000px; + z-index: 999; + background:#eee; + color:#000; + border:1px solid #666; + border-radius:4px; + padding:5px 10px; + text-align:center; + left:0; top:0; + font-size:11px; + opacity:0; + visibility:hidden; +} +.webaudioctrl-tooltip:before{ + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -8px; + border: 8px solid transparent; + border-top: 8px solid #666; +} +.webaudioctrl-tooltip:after{ + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -6px; + border: 6px solid transparent; + border-top: 6px solid #eee; +} +`; + } + sendEvent(ev){ + let event; + event=document.createEvent("HTMLEvents"); + event.initEvent(ev,false,true); + this.dispatchEvent(event); + } + getAttr(n,def){ + let v=this.getAttribute(n); + if(v==""||v==null) return def; + switch(typeof(def)){ + case "number": + if(v=="true") return 1; + v=+v; + if(isNaN(v)) return 0; + return v; + } + return v; + } + showtip(d){ + function valstr(x,c,type){ + switch(type){ + case "x": return (x|0).toString(16); + case "X": return (x|0).toString(16).toUpperCase(); + case "d": return (x|0).toString(); + case "f": return x.toFixed(c); + case "s": return x.toString(); + } + return ""; + } + function numformat(s,x){ + if(typeof(x)=="undefined") + return; + let i=s.indexOf("%"); + let c=[0,0],type=0,m=0,r="",j=i+1; + for(;j=0){ + type=s[j]; + break; + } + if(s[j]==".") + m=1; + else + c[m]=c[m]*10+parseInt(s[j]); + } + if(typeof(x)=="number") + r=valstr(x,c[1],type); + else + r=valstr(x.x,c[1],type)+","+valstr(x.y,c[1],type); + if(c[0]>0) + r=(" "+r).slice(-c[0]); + r=s.replace(/%.*[xXdfs]/,r); + return r; + } + let s=this.tooltip; + if(this.drag||this.hover){ + if(this.valuetip){ + if(s==null) + s=`%.${this.digits}f`; + else if(s.indexOf("%")<0) + s+=` : %.${this.digits}f`; + } + if(s){ + this.ttframe.innerHTML=numformat(s,this.convValue); + this.ttframe.style.display="inline-block"; + this.ttframe.style.width="auto"; + this.ttframe.style.height="auto"; + this.ttframe.style.transition="opacity 0.5s "+d+"s,visibility 0.5s "+d+"s"; + this.ttframe.style.opacity=0.9; + this.ttframe.style.visibility="visible"; + let rc=this.getBoundingClientRect(),rc2=this.ttframe.getBoundingClientRect(),rc3=document.documentElement.getBoundingClientRect(); + this.ttframe.style.left=((rc.width-rc2.width)*0.5+1000)+"px"; + this.ttframe.style.top=(-rc2.height-8)+"px"; + return; + } + } + this.ttframe.style.transition="opacity 0.1s "+d+"s,visibility 0.1s "+d+"s"; + this.ttframe.style.opacity=0; + this.ttframe.style.visibility="hidden"; + } + pointerover(e) { + this.hover=1; + this.showtip(0.6); + } + pointerout(e) { + this.hover=0; + this.showtip(0); + } + contextMenu(e){ + if(window.webAudioControlsMidiManager && this.midilearn) + webAudioControlsMidiManager.contextMenuOpen(e,this); + e.preventDefault(); + e.stopPropagation(); + } + setMidiController(channel, cc) { + if (this.listeningToThisMidiController(channel, cc)) return; + this.midiController={ 'channel': channel, 'cc': cc}; + console.log("Added mapping for channel=" + channel + " cc=" + cc + " tooltip=" + this.tooltip); + } + listeningToThisMidiController(channel, cc) { + const c = this.midiController; + if((c.channel === channel || c.channel < 0) && c.cc === cc) + return true; + return false; + } + processMidiEvent(event){ + const channel = event.data[0] & 0xf; + const controlNumber = event.data[1]; + if(this.midiMode == 'learn') { + this.setMidiController(channel, controlNumber); + webAudioControlsMidiManager.contextMenuClose(); + this.midiMode = 'normal'; + } + if(this.listeningToThisMidiController(channel, controlNumber)) { + if(this.tagName=="WEBAUDIO-SWITCH"){ + switch(this.type){ + case "toggle": + if(event.data[2]>=64) + this.setValue(1-this.value,true); + break; + case "kick": + this.setValue(event.data[2]>=64?1:0); + break; + case "radio": + let els=document.querySelectorAll("webaudio-switch[type='radio'][group='"+this.group+"']"); + for(let i=0;i +${this.basestyle} +webaudio-knob{ + display:inline-block; + position:relative; + margin:0; + padding:0; + cursor:pointer; + font-family: sans-serif; + font-size: 11px; +} +.webaudio-knob-body{ + display:inline-block; + position:relative; + margin:0; + padding:0; + vertical-align:bottom; +} + +
    +`; + this.elem=root.childNodes[2]; + this.ttframe=root.childNodes[3]; + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",opt.knobSrc); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=+v;this.redraw()}}); + this._max=this.getAttr("max",100); Object.defineProperty(this,"max",{get:()=>{return this._max},set:(v)=>{this._max=+v;this.redraw()}}); + this._step=this.getAttr("step",1); Object.defineProperty(this,"step",{get:()=>{return this._step},set:(v)=>{this._step=+v;this.redraw()}}); + this._sprites=this.getAttr("sprites",opt.knobSprites); Object.defineProperty(this,"sprites",{get:()=>{return this._sprites},set:(v)=>{this._sprites=v;this.setupImage()}}); + this._width=this.getAttr("width",opt.knobWidth); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",opt.knobHeight); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._diameter=this.getAttr("diameter",opt.knobDiameter); Object.defineProperty(this,"diameter",{get:()=>{return this._diameter},set:(v)=>{this._diameter=v;this.setupImage()}}); + this._colors=this.getAttr("colors",opt.knobColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.sensitivity=this.getAttr("sensitivity",1); + this.valuetip=this.getAttr("valuetip",1); + this.tooltip=this.getAttr("tooltip",null); + this.conv=this.getAttr("conv",null); + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + this.coltab=["#e00","#000","#000"]; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + } + disconnectedCallback(){} + setupImage(){ + this.kw=this.width||this.diameter; + this.kh=this.height||this.diameter; + if(!this.src){ + if(this.colors) + this.coltab = this.colors.split(";"); + if(!this.coltab) + this.coltab=["#e00","#000","#000"]; + let svg= +` + + +`; + for(let i=0;i<101;++i){ + svg += ``; + svg += ``; + } + svg += ""; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svg)+")"; +// this.elem.style.backgroundSize = "100% 10100%"; + this.elem.style.backgroundSize = `${this.kw}px ${this.kh*101}px`; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + if(!this.sprites) + this.elem.style.backgroundSize = "100% 100%"; + else{ +// this.elem.style.backgroundSize = `100% ${(this.sprites+1)*100}%`; + this.elem.style.backgroundSize = `${this.kw}px ${this.kh*(this.sprites+1)}px`; + } + } + this.elem.style.outline=this.outline?"":"none"; + this.elem.style.width=this.kw+"px"; + this.elem.style.height=this.kh+"px"; + this.style.height=this.kh+"px"; + this.redraw(); + } + redraw() { + this.digits=0; + if(this.step && this.step < 1) { + for(let n = this.step ; n < 1; n *= 10) + ++this.digits; + } + if(this.valuethis.max){ + this.value=this.max; + return; + } + let range = this.max - this.min; + let style = this.elem.style; + let sp = this.src?this.sprites:100; + if(sp>=1){ + let offset = ((sp * (this.value - this.min) / range) | 0); + style.backgroundPosition = "0px " + (-offset*this.kh) + "px"; + style.transform = 'rotate(0deg)'; + } else { + let deg = 270 * ((this.value - this.min) / range - 0.5); + style.backgroundPosition="0px 0px"; + style.transform = 'rotate(' + deg + 'deg)'; + } + } + _setValue(v){ + if(this.step) + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._value=Math.min(this.max,Math.max(this.min,v)); + if(this._value!=this.oldvalue){ + this.oldvalue=this._value; + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setValue(v,f){ + if(this._setValue(v) && f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e) { + let delta=(this.max-this.min)*0.01; + delta=e.deltaY>0?-delta:delta; + if(!e.shiftKey) + delta*=5; + if(Math.abs(delta) < this.step) + delta = (delta > 0) ? +this.step : -this.step; + this.setValue(+this.value+delta,true); + e.preventDefault(); + e.stopPropagation(); + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(ev)=>{ + let e=ev; + if(ev.touches){ + for(let i=0;i{ + let e=ev; + if(ev.touches){ + for(let i=0;;){ + if(ev.changedTouches[i].identifier==this.identifier){ + break; + } + if(++i>=ev.changedTouches.length) + return; + } + } + this.drag=0; + this.showtip(0); + this.startPosX = this.startPosY = null; + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + this.sendEvent("change"); + } + let preventScroll=(e)=>{ + e.preventDefault(); + } + if(e.ctrlKey || e.metaKey) + this.setValue(this.defvalue,true); + else { + this.startPosX = e.pageX; + this.startPosY = e.pageY; + this.startVal = this.value; + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + } + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + ev.preventDefault(); + ev.stopPropagation(); + return false; + } + }); +} catch(error){ + console.log("webaudio-knob already defined"); +} + +try{ + customElements.define("webaudio-slider", class WebAudioSlider extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.elem=root.childNodes[2]; + this.knob=this.elem.childNodes[0]; + this.ttframe=root.childNodes[3]; + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",opt.sliderSrc); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._knobsrc=this.getAttr("knobsrc",opt.sliderKnobsrc); Object.defineProperty(this,"knobsrc",{get:()=>{return this._knobsrc},set:(v)=>{this._knobsrc=v;this.setupImage()}}); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=v;this.redraw()}}); + this._max=this.getAttr("max",100); Object.defineProperty(this,"max",{get:()=>{return this._max},set:(v)=>{this._max=v;this.redraw()}}); + this._step=this.getAttr("step",1); Object.defineProperty(this,"step",{get:()=>{return this._step},set:(v)=>{this._step=v;this.redraw()}}); + this._sprites=this.getAttr("sprites",0); Object.defineProperty(this,"sprites",{get:()=>{return this._sprites},set:(v)=>{this._sprites=v;this.setupImage()}}); + this._direction=this.getAttr("direction",null); Object.defineProperty(this,"direction",{get:()=>{return this._direction},set:(v)=>{this._direction=v;this.setupImage()}}); + this._width=this.getAttr("width",opt.sliderWidth); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",opt.sliderHeight); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + if(this._direction=="horz"){ + if(this._width==0) this._width=128; + if(this._height==0) this._height=24; + } + else{ + if(this._width==0) this._width=24; + if(this._height==0) this._height=128; + } + this._knobwidth=this.getAttr("knobwidth",opt.sliderKnobwidth); Object.defineProperty(this,"knobwidth",{get:()=>{return this._knobwidth},set:(v)=>{this._knobwidth=v;this.setupImage()}}); + this._knobheight=this.getAttr("knbheight",opt.sliderKnobheight); Object.defineProperty(this,"knobheight",{get:()=>{return this._knobheight},set:(v)=>{this._knobheight=v;this.setupImage()}}); + this._ditchlength=this.getAttr("ditchlength",opt.sliderDitchlength); Object.defineProperty(this,"ditchlength",{get:()=>{return this._ditchlength},set:(v)=>{this._ditchlength=v;this.setupImage()}}); + this._colors=this.getAttr("colors",opt.sliderColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.sensitivity=this.getAttr("sensitivity",1); + this.valuetip=this.getAttr("valuetip",1); + this.tooltip=this.getAttr("tooltip",null); + this.conv=this.getAttr("conv",null); + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.elem.onclick=(e)=>{e.stopPropagation()}; + } + disconnectedCallback(){} + setupImage(){ + this.coltab = this.colors.split(";"); + this.dr=this.direction; + this.dlen=this.ditchlength; + if(!this.width){ + if(this.dr=="horz") + this.width=128; + else + this.width=24; + } + if(!this.height){ + if(this.dr=="horz") + this.height=24; + else + this.height=128; + } + if(!this.dr) + this.dr=(this.width<=this.height)?"vert":"horz"; + if(this.dr=="vert"){ + if(!this.dlen) + this.dlen=this.height-this.width; + } + else{ + if(!this.dlen) + this.dlen=this.width-this.height; + } + this.knob.style.backgroundSize = "100% 100%"; + this.elem.style.backgroundSize = "100% 100%"; + this.elem.style.width=this.width+"px"; + this.elem.style.height=this.height+"px"; + this.style.height=this.height+"px"; + this.kwidth=this.knobwidth||(this.dr=="horz"?this.height:this.width); + this.kheight=this.knobheight||(this.dr=="horz"?this.height:this.width); + this.knob.style.width = this.kwidth+"px"; + this.knob.style.height = this.kheight+"px"; + if(!this.src){ + let r=Math.min(this.width,this.height)*0.5; + let svgbody= +` +`; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgbody)+")"; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + } + if(!this.knobsrc){ + let svgthumb= +` + +`; + this.knob.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgthumb)+")"; + } + else{ + this.knob.style.backgroundImage = "url("+(this.knobsrc)+")"; + } + this.elem.style.outline=this.outline?"":"none"; + this.redraw(); + } + redraw() { + this.digits=0; + if(this.step && this.step < 1) { + for(let n = this.step ; n < 1; n *= 10) + ++this.digits; + } + if(this.valuethis.max){ + this.value=this.max; + return; + } + let range = this.max - this.min; + let style = this.knob.style; + if(this.dr=="vert"){ + style.left=(this.width-this.kwidth)*0.5+"px"; + style.top=(1-(this.value-this.min)/range)*this.dlen+"px"; + this.sensex=0; this.sensey=1; + } + else{ + style.top=(this.height-this.kheight)*0.5+"px"; + style.left=(this.value-this.min)/range*this.dlen+"px"; + this.sensex=1; this.sensey=0; + } + } + _setValue(v){ + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._value=Math.min(this.max,Math.max(this.min,v)); + if(this._value!=this.oldvalue){ + this.oldvalue=this._value; + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setValue(v,f){ + if(this._setValue(v)&&f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e) { + let delta=(this.max-this.min)*0.01; + delta=e.deltaY>0?-delta:delta; + if(!e.shiftKey) + delta*=5; + if(Math.abs(delta) < this.step) + delta = (delta > 0) ? +this.step : -this.step; + this.setValue(+this.value+delta,true); + e.preventDefault(); + e.stopPropagation(); + this.redraw(); + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(ev)=>{ + let e=ev; + if(ev.touches){ + for(let i=0;i{ + let e=ev; + if(ev.touches){ + for(let i=0;;){ + if(ev.changedTouches[i].identifier==this.identifier){ + break; + } + if(++i>=ev.changedTouches.length) + return; + } + } + this.drag=0; + this.showtip(0); + this.startPosX = this.startPosY = null; + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + this.sendEvent("change"); + } + let preventScroll=(e)=>{ + e.preventDefault(); + } + if(e.touches) + e = e.touches[0]; + if(e.ctrlKey || e.metaKey) + this.setValue(this.defvalue,true); + else { + this.startPosX = e.pageX; + this.startPosY = e.pageY; + this.startVal = this.value; + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + } + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); +} catch(error){ + console.log("webaudio-slider already defined"); +} + +try{ + customElements.define("webaudio-switch", class WebAudioSwitch extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.elem=root.childNodes[2]; + this.ttframe=this.elem.childNodes[0]; + + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",null); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this.type=this.getAttr("type","toggle"); + this.group=this.getAttr("group",""); + this._width=this.getAttr("width",0); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",0); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._diameter=this.getAttr("diameter",0); Object.defineProperty(this,"diameter",{get:()=>{return this._diameter},set:(v)=>{this._diameter=v;this.setupImage()}}); + this.invert=this.getAttr("invert",0); + this._colors=this.getAttr("colors",opt.switchColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.valuetip=0; + this.tooltip=this.getAttr("tooltip",null); + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.elem.onclick=(e)=>{e.stopPropagation()}; + } + disconnectedCallback(){} + setupImage(){ + let w=this.width||this.diameter||opt.switchWidth||opt.switchDiameter; + let h=this.height||this.diameter||opt.switchHeight||opt.switchDiameter; + if(!this.src){ + this.coltab = this.colors.split(";"); + let mm=Math.min(w,h); + let svg= +` + + + + +`; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svg)+")"; + this.elem.style.backgroundSize = "100% 200%"; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + if(!this.sprites) + this.elem.style.backgroundSize = "100% 200%"; + else + this.elem.style.backgroundSize = `100% ${(this.sprites+1)*100}%`; + } + this.elem.style.width=w+"px"; + this.elem.style.height=h+"px"; + this.style.height=h+"px"; + this.elem.style.outline=this.outline?"":"none"; + this.redraw(); + } + redraw() { + let style = this.elem.style; + if(this.value^this.invert) + style.backgroundPosition = "0px -100%"; + else + style.backgroundPosition = "0px 0px"; + } + setValue(v,f){ + this.value=v; + this.checked=(!!v); + if(this.value!=this.oldvalue){ + this.redraw(); + this.showtip(0); + if(f){ + this.sendEvent("input"); + this.sendEvent("change"); + } + this.oldvalue=this.value; + } + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(e)=>{ + e.preventDefault(); + e.stopPropagation(); + return false; + } + let pointerup=(e)=>{ + this.drag=0; + this.showtip(0); + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + if(this.type=="kick"){ + this.value=0; + this.checked=false; + this.redraw(); + this.sendEvent("change"); + } + this.sendEvent("click"); + e.preventDefault(); + e.stopPropagation(); + } + let preventScroll=(e)=>{ + e.preventDefault(); + } + switch(this.type){ + case "kick": + this.setValue(1); + this.sendEvent("change"); + break; + case "toggle": + if(e.ctrlKey || e.metaKey) + this.value=defvalue; + else + this.value=1-this.value; + this.checked=!!this.value; + this.sendEvent("change"); + break; + case "radio": + let els=document.querySelectorAll("webaudio-switch[type='radio'][group='"+this.group+"']"); + for(let i=0;i +${this.basestyle} +webaudio-param{ + display:inline-block; + user-select:none; + margin:0; + padding:0; + font-family: sans-serif; + font-size: 8px; + cursor:pointer; + position:relative; + vertical-align:baseline; +} +.webaudio-param-body{ + display:inline-block; + position:relative; + text-align:center; + border:1px solid #888; + background:none; + border-radius:4px; + margin:0; + padding:0; + font-family:sans-serif; + font-size:11px; + vertical-align:bottom; +} + +
    +`; + this.elem=root.childNodes[2]; + this.ttframe=root.childNodes[3]; + this.enable=this.getAttr("enable",1); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this._fontsize=this.getAttr("fontsize",9); Object.defineProperty(this,"fontsize",{get:()=>{return this._fontsize},set:(v)=>{this._fontsize=v;this.setupImage()}}); + this._src=this.getAttr("src",null); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this.link=this.getAttr("link",""); + this._width=this.getAttr("width",32); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",20); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._colors=this.getAttr("colors","#fff;#000"); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.fromLink=((e)=>{ + this.setValue(e.target.convValue.toFixed(e.target.digits)); + }).bind(this); + this.elem.onchange=()=>{ + this.value=this.elem.value; + let le=document.getElementById(this.link); + if(le) + le.setValue(+this.elem.value); + } + } + disconnectedCallback(){} + setupImage(){ + this.coltab = this.colors.split(";"); + this.elem.style.color=this.coltab[0]; + if(!this.src){ + this.elem.style.backgroundColor=this.coltab[1]; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + this.elem.style.backgroundSize = "100% 100%"; + } + this.elem.style.width=this.width+"px"; + this.elem.style.height=this.height+"px"; + this.elem.style.fontSize=this.fontsize+"px"; + this.elem.style.outline=this.outline?"":"none"; + let l=document.getElementById(this.link); + if(l&&typeof(l.value)!="undefined"){ + this.setValue(l.value.toFixed(l.digits)); + l.addEventListener("input",(e)=>{this.setValue(l.value.toFixed(l.digits))}); + } + this.redraw(); + } + redraw() { + this.elem.value=this.value; + } + setValue(v,f){ + this.value=v; + if(this.value!=this.oldvalue){ + this.redraw(); + this.showtip(0); + if(f){ + let event=document.createEvent("HTMLEvents"); + event.initEvent("change",false,true); + this.dispatchEvent(event); + } + this.oldvalue=this.value; + } + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches) + e = ev.touches[0]; + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.redraw(); + } + }); +} catch(error){ + console.log("webaudio-param already defined"); +} + +try{ + customElements.define("webaudio-keyboard", class WebAudioKeyboard extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.cv=root.childNodes[2]; + this.ttframe=root.childNodes[3]; + this.ctx=this.cv.getContext("2d"); + this._values=[]; + this.enable=this.getAttr("enable",1); + this._width=this.getAttr("width",480); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",128); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=+v;this.redraw()}}); + this._keys=this.getAttr("keys",25); Object.defineProperty(this,"keys",{get:()=>{return this._keys},set:(v)=>{this._keys=+v;this.setupImage()}}); + this._colors=this.getAttr("colors","#222;#eee;#ccc;#333;#000;#e88;#c44;#c33;#800"); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.midilearn=this.getAttr("midilearn",0); + this.midicc=this.getAttr("midicc",null); + this.press=0; + this.keycodes1=[90,83,88,68,67,86,71,66,72,78,74,77,188,76,190,187,191,226]; + this.keycodes2=[81,50,87,51,69,82,53,84,54,89,55,85,73,57,79,48,80,192,222,219]; + this.addEventListener("keyup",this.keyup); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) + window.webAudioControlsMidiManager.addWidget(this); + } + disconnectedCallback(){} + setupImage(){ + this.cv.style.width=this.width+"px"; + this.cv.style.height=this.height+"px"; + this.bheight = this.height * 0.55; + this.kp=[0,7/12,1,3*7/12,2,3,6*7/12,4,8*7/12,5,10*7/12,6]; + this.kf=[0,1,0,1,0,0,1,0,1,0,1,0]; + this.ko=[0,0,(7*2)/12-1,0,(7*4)/12-2,(7*5)/12-3,0,(7*7)/12-4,0,(7*9)/12-5,0,(7*11)/12-6]; + this.kn=[0,2,4,5,7,9,11]; + this.coltab=this.colors.split(";"); + this.cv.width = this.width; + this.cv.height = this.height; + this.cv.style.width = this.width+'px'; + this.cv.style.height = this.height+'px'; + this.style.height = this.height+'px'; + this.cv.style.outline=this.outline?"":"none"; + this.bheight = this.height * 0.55; + this.max=this.min+this.keys-1; + this.dispvalues=[]; + this.valuesold=[]; + if(this.kf[this.min%12]) + --this.min; + if(this.kf[this.max%12]) + ++this.max; + this.redraw(); + } + redraw(){ + function rrect(ctx, x, y, w, h, r, c1, c2) { + if(c2) { + let g=ctx.createLinearGradient(x,y,x+w,y); + g.addColorStop(0,c1); + g.addColorStop(1,c2); + ctx.fillStyle=g; + } + else + ctx.fillStyle=c1; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x+w, y); + ctx.lineTo(x+w, y+h-r); + ctx.quadraticCurveTo(x+w, y+h, x+w-r, y+h); + ctx.lineTo(x+r, y+h); + ctx.quadraticCurveTo(x, y+h, x, y+h-r); + ctx.lineTo(x, y); + ctx.fill(); + } + this.ctx.fillStyle = this.coltab[0]; + this.ctx.fillRect(0,0,this.width,this.height); + let x0=7*((this.min/12)|0)+this.kp[this.min%12]; + let x1=7*((this.max/12)|0)+this.kp[this.max%12]; + let n=x1-x0; + this.wwidth=(this.width-1)/(n+1); + this.bwidth=this.wwidth*7/12; + let h2=this.bheight; + let r=Math.min(8,this.wwidth*0.2); + for(let i=this.min,j=0;i<=this.max;++i) { + if(this.kf[i%12]==0) { + let x=this.wwidth*(j++)+1; + if(this.dispvalues.indexOf(i)>=0) + rrect(this.ctx,x,1,this.wwidth-1,this.height-2,r,this.coltab[5],this.coltab[6]); + else + rrect(this.ctx,x,1,this.wwidth-1,this.height-2,r,this.coltab[1],this.coltab[2]); + } + } + r=Math.min(8,this.bwidth*0.3); + for(let i=this.min;i=0) + rrect(this.ctx,x,1,this.bwidth,h2,r,this.coltab[7],this.coltab[8]); + else + rrect(this.ctx,x,1,this.bwidth,h2,r,this.coltab[3],this.coltab[4]); + this.ctx.strokeStyle=this.coltab[0]; + this.ctx.stroke(); + } + } + } + _setValue(v){ + if(this.step) + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._value=Math.min(this.max,Math.max(this.min,v)); + if(this._value!=this.oldvalue){ + this.oldvalue=this._value; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setValue(v,f){ + if(this._setValue(v) && f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e){} + keydown(e){ + let m=Math.floor((this.min+11)/12)*12; + let k=this.keycodes1.indexOf(e.keyCode); + if(k<0) { + k=this.keycodes2.indexOf(e.keyCode); + if(k>=0) k+=12; + } + if(k>=0){ + k+=m; + if(this.currentKey!=k){ + this.currentKey=k; + this.sendEventFromKey(1,k); + this.setNote(1,k); + } + } + } + keyup(e){ + let m=Math.floor((this.min+11)/12)*12; + let k=this.keycodes1.indexOf(e.keyCode); + if(k<0) { + k=this.keycodes2.indexOf(e.keyCode); + if(k>=0) k+=12; + } + if(k>=0){ + k+=m; + this.currentKey=-1; + this.sendEventFromKey(0,k); + this.setNote(0,k); + } + } + pointerdown(ev){ + this.cv.focus(); + if(this.enable) { + ++this.press; + } + let pointermove=(ev)=>{ + if(!this.enable) + return; + let r=this.getBoundingClientRect(); + let v=[],p; + if(ev.touches) + p=ev.targetTouches; + else if(this.press) + p=[ev]; + else + p=[]; + if(p.length>0) + this.drag=1; + for(let i=0;i=0&&py=this.min&&k<=this.max) + v.push(k); + } + } + v.sort(); + this.values=v; + this.sendevent(); + this.redraw(); + } + + let pointerup=(ev)=>{ + if(this.enable) { + if(ev.touches) + this.press=ev.touches.length; + else + this.press=0; + pointermove(ev); + this.sendevent(); + if(this.press==0){ + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + } + this.redraw(); + } + this.drag=0; + ev.preventDefault(); + } + let preventScroll=(ev)=>{ + ev.preventDefault(); + } + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + pointermove(ev); + ev.preventDefault(); + ev.stopPropagation(); + } + sendEventFromKey(s,k){ + let ev=document.createEvent('HTMLEvents'); + ev.initEvent('change',true,true); + ev.note=[s,k]; + this.dispatchEvent(ev); + } + sendevent(){ + let notes=[]; + for(let i=0,j=this.valuesold.length;i=0) this.dispvalues.splice(n,1); + } + } + setNote(state,note) { + this.setdispvalues(state,note); + this.redraw(); + } + }); +} catch(error){ + console.log("webaudio-keyboard already defined"); +} + +try{ + customElements.define("webaudio-xypad", class WebAudioXYPad extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.elem=root.childNodes[2]; + this.knob=this.elem.childNodes[0]; + this.ttframe=root.childNodes[3]; + + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",opt.sliderSrc); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._knobsrc=this.getAttr("knobsrc",opt.sliderKnobsrc); Object.defineProperty(this,"knobsrc",{get:()=>{return this._knobsrc},set:(v)=>{this._knobsrc=v;this.setupImage()}}); + this._x=this.getAttr("x",50); Object.defineProperty(this,"x",{get:()=>{return this._x},set:(v)=>{this._x=v;this.redraw()}}); + this._y=this.getAttr("y",50); Object.defineProperty(this,"y",{get:()=>{return this._y},set:(v)=>{this._y=v;this.redraw()}}); + this.defx=this.getAttr("defx",50); + this.defy=this.getAttr("defy",50); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=v;this.redraw()}}); + this._max=this.getAttr("max",100); Object.defineProperty(this,"max",{get:()=>{return this._max},set:(v)=>{this._max=v;this.redraw()}}); + this._step=this.getAttr("step",1); Object.defineProperty(this,"step",{get:()=>{return this._step},set:(v)=>{this._step=v;this.redraw()}}); + this._sprites=this.getAttr("sprites",0); Object.defineProperty(this,"sprites",{get:()=>{return this._sprites},set:(v)=>{this._sprites=v;this.setupImage()}}); + this._width=this.getAttr("width",128); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",128); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._knobwidth=this.getAttr("knobwidth",28); Object.defineProperty(this,"knobwidth",{get:()=>{return this._knobwidth},set:(v)=>{this._knobwidth=v;this.setupImage()}}); + this._knobheight=this.getAttr("knbheight",28); Object.defineProperty(this,"knobheight",{get:()=>{return this._knobheight},set:(v)=>{this._knobheight=v;this.setupImage()}}); + this._colors=this.getAttr("colors",opt.sliderColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.valuetip=this.getAttr("valuetip",1); + this.tooltip=this.getAttr("tooltip",null); + this.conv=this.getAttr("conv",null); + if(this.conv){ + this.convValue={x:eval(this.conv)(this._x),y:eval(this.conv)(this._y)}; + } + else + this.convValue={x:this._x,y:this._y}; + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.elem.onclick=(e)=>{e.stopPropagation()}; + } + disconnectedCallback(){} + setupImage(){ + this.coltab = this.colors.split(";"); + this.dr=this.direction; + this.dlen=this.ditchlength; + if(!this.width) + this.width=256; + if(!this.height) + this.height=256; + this.knob.style.backgroundSize = "100% 100%"; + this.elem.style.backgroundSize = "100% 100%"; + this.elem.style.width=this.width+"px"; + this.elem.style.height=this.height+"px"; + this.kwidth=this.knobwidth||(this.width*0.15|0); + this.kheight=this.knobheight||(this.height*0.15|0); + this.knob.style.width = this.kwidth+"px"; + this.knob.style.height = this.kheight+"px"; + if(!this.src){ + let r=Math.min(this.width,this.height)*0.02; + let svgbody= +` +`; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgbody)+")"; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + } + if(!this.knobsrc){ + let svgthumb= +` + +`; + this.knob.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgthumb)+")"; + } + else{ + this.knob.style.backgroundImage = "url("+(this.knobsrc)+")"; + } + this.elem.style.outline=this.outline?"":"none"; + this.redraw(); + } + redraw() { + this.digits=0; + if(this.step && this.step < 1) { + for(let n = this.step ; n < 1; n *= 10) + ++this.digits; + } + if(this.valuethis.max){ + this.value=this.max; + return; + } + let range = this.max - this.min; + let style = this.knob.style; + style.left=(this.width-this.kwidth)*(this._x-this.min)/(this.max-this.min)+"px"; style.top=(this.height-this.kheight)*(1-(this._y-this.min)/(this.max-this.min))+"px"; + this.sensex=0; this.sensey=1; + } + _setX(v){ + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._x=Math.min(this.max,Math.max(this.min,v)); + if(this._x!=this.oldx){ + this.oldx=this._x; + if(this.conv){ + this.convValue={x:eval(this.conv)(this._x),y:eval(this.conv)(this._y)}; + } + else + this.convValue={x:this._x,y:this._y}; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + _setY(v){ + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._y=Math.min(this.max,Math.max(this.min,v)); + if(this._y!=this.oldy){ + this.oldy=this._y; + if(this.conv){ + this.convValue={x:eval(this.conv)(this._x),y:eval(this.conv)(this._y)}; + } + else + this.convValue={x:this._x,y:this._y}; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setX(v,f){ + if(this._setX(v)&&f) + this.sendEvent("input"),this.sendEvent("change"); + } + setY(v,f){ + if(this._setY(v)&&f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e) { + let delta=(this.max-this.min)*0.01; + delta=e.deltaY>0?-delta:delta; + if(!e.shiftKey) + delta*=5; + if(Math.abs(delta) < this.step) + delta = (delta > 0) ? +this.step : -this.step; + this.setValue(+this.value+delta,true); + e.preventDefault(); + e.stopPropagation(); + this.redraw(); + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(ev)=>{ + let e=ev; + if(ev.touches){ + for(let i=0;i{ + let e=ev; + if(ev.touches){ + for(let i=0;;){ + if(ev.changedTouches[i].identifier==this.identifier){ + break; + } + if(++i>=ev.changedTouches.length) + return; + } + } + this.drag=0; + this.showtip(0); + this.startPosX = this.startPosY = null; + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + this.sendEvent("change"); + } + pointermove(ev); + let preventScroll=(e)=>{ + e.preventDefault(); + } + if(e.touches) + e = e.touches[0]; + if(e.ctrlKey || e.metaKey) + this.setValue(this.defvalue,true); + else { + this.startPosX = e.pageX; + this.startPosY = e.pageY; + this.startVal = this.value; + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + } + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); +} catch(error){ + console.log("webaudio-xypad already defined"); +} + + + + // FOR MIDI LEARN + class WebAudioControlsMidiManager { + constructor(){ + this.midiAccess = null; + this.listOfWidgets = []; + this.listOfExternalMidiListeners = []; + this.updateWidgets(); + this.initWebAudioControls(); + } + addWidget(w){ + this.listOfWidgets.push(w); + } + updateWidgets(){ +// this.listOfWidgets = document.querySelectorAll("webaudio-knob,webaudio-slider,webaudio-switch"); + } + initWebAudioControls() { + if(navigator.requestMIDIAccess) { + navigator.requestMIDIAccess().then( + (ma)=>{this.midiAccess = ma,this.enableInputs()}, + (err)=>{ console.log("MIDI not initialized - error encountered:" + err.code)} + ); + } + } + enableInputs() { + let inputs = this.midiAccess.inputs.values(); + console.log("Found " + this.midiAccess.inputs.size + " MIDI input(s)"); + for(let input = inputs.next(); input && !input.done; input = inputs.next()) { + console.log("Connected input: " + input.value.name); + input.value.onmidimessage = this.handleMIDIMessage.bind(this); + } + } + midiConnectionStateChange(e) { + console.log("connection: " + e.port.name + " " + e.port.connection + " " + e.port.state); + enableInputs(); + } + + onMIDIStarted(midi) { + this.midiAccess = midi; + midi.onstatechange = this.midiConnectionStateChange; + enableInputs(midi); + } + // Add hooks for external midi listeners support + addMidiListener(callback) { + this.listOfExternalMidiListeners.push(callback); + } + getCurrentConfigAsJSON() { + return currentConfig.stringify(); + } + handleMIDIMessage(event) { + this.listOfExternalMidiListeners.forEach(function (externalListener) { + externalListener(event); + }); + if(((event.data[0] & 0xf0) == 0xf0) || ((event.data[0] & 0xf0) == 0xb0 && event.data[1] >= 120)) + return; + for(let w of this.listOfWidgets) { + if(w.processMidiEvent) + w.processMidiEvent(event); + } + if(opt.mididump) + console.log(event.data); + } + contextMenuOpen(e,knob){ + if(!this.midiAccess) + return; + let menu=document.getElementById("webaudioctrl-context-menu"); + menu.style.left=e.pageX+"px"; + menu.style.top=e.pageY+"px"; + menu.knob=knob; + menu.classList.add("active"); + menu.knob.focus(); +// document.activeElement.onblur=this.contextMenuClose; + menu.knob.addEventListener("keydown",this.contextMenuCloseByKey.bind(this)); + } + contextMenuCloseByKey(e){ + if(e.keyCode==27) + this.contextMenuClose(); + } + contextMenuClose(){ + let menu=document.getElementById("webaudioctrl-context-menu"); + menu.knob.removeEventListener("keydown",this.contextMenuCloseByKey); + menu.classList.remove("active"); + let menuItemLearn=document.getElementById("webaudioctrl-context-menu-learn"); + menuItemLearn.innerHTML = 'Learn'; + menu.knob.midiMode = 'normal'; + } + contextMenuLearn(){ + let menu=document.getElementById("webaudioctrl-context-menu"); + let menuItemLearn=document.getElementById("webaudioctrl-context-menu-learn"); + menuItemLearn.innerHTML = 'Listening...'; + menu.knob.midiMode = 'learn'; + } + contextMenuClear(e){ + let menu=document.getElementById("webaudioctrl-context-menu"); + menu.knob.midiController={}; + this.contextMenuClose(); + } + } + if(window.UseWebAudioControlsMidi||opt.useMidi) + window.webAudioControlsMidiManager = new WebAudioControlsMidiManager(); +} diff --git a/www/webcomponents-lite.js b/www/webcomponents-lite.js new file mode 100755 index 0000000..d3e7beb --- /dev/null +++ b/www/webcomponents-lite.js @@ -0,0 +1,197 @@ +(function(){/* + + Copyright (c) 2016 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ +'use strict';var p,q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};function ca(){ca=function(){};q.Symbol||(q.Symbol=da)}var da=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}(); +function ea(){ca();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&ba(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return fa(this)}});ea=function(){}}function fa(a){var b=0;return ha(function(){return b"+this.innerHTML+""},set:function(a){if(this.parentNode){J.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();J.body.firstChild;)l.call(a, +J.body.firstChild);m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};na(a.prototype);aa(a.prototype);a.J=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d]/g, +U=function(a){switch(a){case "&":return"&";case "<":return"<";case ">":return">";case "\u00a0":return" "}}}if(c||eb){a.ca=function(a,b){var c=f.call(a,!1);this.D&&this.D(c);b&&(l.call(c.content,f.call(a.content,!0)),fb(c.content,a.content));return c};var fb=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,x={La:function(a,b){a.href&&a.setAttribute("href",x.Y(a.getAttribute("href"),b));a.src&&a.setAttribute("src",x.Y(a.getAttribute("src"),b));if("style"===a.localName){var c=x.ta(a.textContent,b,Ca);a.textContent=x.ta(c,b,Da)}},ta:function(a,b,c){return a.replace(c, +function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=x.Y(a,b));return c+"'"+a+"'"+e})},Y:function(a,b){if(void 0===x.ba){x.ba=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";x.ba="http://a/c%20d"===c.href}catch(Lg){}}if(x.ba)return(new URL(a,b)).href;c=x.Ba;c||(c=document.implementation.createHTMLDocument("temp"),x.Ba=c,c.ma=c.createElement("base"),c.head.appendChild(c.ma),c.la=c.createElement("a"));c.ma.href=b;c.la.href=a;return c.la.href||a}},na={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a= +a.split(",");var d=a[1];d=-1e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},aa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent); +k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){return b.s(a)})};k.prototype.s=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.h(a))}else this.b++,this.a[c]="pending",na.load(c,function(a,d){a=b.Sa(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.L()},function(){b.a[c]=null;b.b--;b.L()})};k.prototype.Sa=function(a,b){if(!a)return document.createDocumentFragment();aa&&(a=a.replace(Ea,function(a,b,c){return-1=== +a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=x.Y(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'); +var d=0;n(c,function(a){h(a);x.La(a,b);a.setAttribute("import-dependency","");"script"===a.localName&&!a.src&&a.textContent&&(a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n"))),a.textContent="",d++)});return a};k.prototype.L=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}), +a.Pa()))};this.Ua(function(){c=!0;d()});this.Ta(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Ta=function(a){function b(e){if(e]/g;function hc(a){switch(a){case "&":return"&";case "<":return"<";case ">":return">";case '"':return""";case "\u00a0":return" "}}function ic(a){for(var b={},c=0;c";break a;case Node.TEXT_NODE:g=g.data;g=k&&kc[k.localName]?g:g.replace(gc,hc);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g), +Error("not implemented");}}c+=g}return c};var B={},D=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),E=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function mc(a){var b=[];D.currentNode=a;for(a=D.firstChild();a;)b.push(a),a=D.nextSibling();return b}B.parentNode=function(a){D.currentNode=a;return D.parentNode()};B.firstChild=function(a){D.currentNode=a;return D.firstChild()};B.lastChild=function(a){D.currentNode=a;return D.lastChild()};B.previousSibling=function(a){D.currentNode=a;return D.previousSibling()}; +B.nextSibling=function(a){D.currentNode=a;return D.nextSibling()};B.childNodes=mc;B.parentElement=function(a){E.currentNode=a;return E.parentNode()};B.firstElementChild=function(a){E.currentNode=a;return E.firstChild()};B.lastElementChild=function(a){E.currentNode=a;return E.lastChild()};B.previousElementSibling=function(a){E.currentNode=a;return E.previousSibling()};B.nextElementSibling=function(a){E.currentNode=a;return E.nextSibling()}; +B.children=function(a){var b=[];E.currentNode=a;for(a=E.firstChild();a;)b.push(a),a=E.nextSibling();return b};B.innerHTML=function(a){return lc(a,function(a){return mc(a)})};B.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var nc=Object.getOwnPropertyDescriptor(Element.prototype,"innerHTML")||Object.getOwnPropertyDescriptor(HTMLElement.prototype,"innerHTML"),oc=document.implementation.createHTMLDocument("inert"),pc=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),qc={parentElement:{get:function(){var a=this.__shady&&this.__shady.parentNode;a&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:B.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=this.__shady&&this.__shady.parentNode; +return void 0!==a?a:B.parentNode(this)},configurable:!0},nextSibling:{get:function(){var a=this.__shady&&this.__shady.nextSibling;return void 0!==a?a:B.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=this.__shady&&this.__shady.previousSibling;return void 0!==a?a:B.previousSibling(this)},configurable:!0},className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0},nextElementSibling:{get:function(){if(this.__shady&& +void 0!==this.__shady.nextSibling){for(var a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return B.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){if(this.__shady&&void 0!==this.__shady.previousSibling){for(var a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return B.previousElementSibling(this)},configurable:!0}},rc={childNodes:{get:function(){if(vb(this)){if(!this.__shady.childNodes){this.__shady.childNodes= +[];for(var a=this.firstChild;a;a=a.nextSibling)this.__shady.childNodes.push(a)}var b=this.__shady.childNodes}else b=B.childNodes(this);b.item=function(a){return b[a]};return b},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=this.__shady&&this.__shady.firstChild;return void 0!==a?a:B.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=this.__shady&&this.__shady.lastChild;return void 0!==a?a:B.lastChild(this)}, +configurable:!0},textContent:{get:function(){if(vb(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&a.push(d.textContent);return a.join("")}return B.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:for(;this.firstChild;)this.removeChild(this.firstChild);(0b.__shady.assignedNodes.length&&(b.__shady.ia=!0)}b.__shady.ia&&(b.__shady.ia=!1,od(this,b))}a=this.o;b=[];for(c=0;cb.indexOf(d))||b.push(d);for(a=0;a "+b}))}a=a.replace(Df,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Ka:b,stop:f}}function Bf(a,b){a=a.split(Ef);a[0]+=b;return a.join(Ef)} +function Af(a,b){var c=a.match(Ff);return(c=c&&c[2].trim()||"")?c[0].match(Gf)?a.replace(Ff,function(a,c,f){return b+f}):c.split(Gf)[0]===b?c:Hf:a.replace(wf,b)}function If(a){a.selector===Jf&&(a.selector="html")}hf.prototype.c=function(a){return a.match(zf)?this.b(a,Kf):Bf(a.trim(),Kf)};q.Object.defineProperties(hf.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}}); +var uf=/:(nth[-\w]+)\(([^)]+)\)/,Kf=":not(.style-scope)",sf=",",xf=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Gf=/[[.:#*]/,wf=":host",Jf=":root",zf="::slotted",vf=new RegExp("^("+zf+")"),Ff=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Cf=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Df=/(.*):dir\((?:(ltr|rtl))\)/,qf=".",Ef=":",mf="class",Hf="should_not_match",W=new hf;function Lf(a,b,c,d){this.w=a||null;this.b=b||null;this.ja=c||[];this.G=null;this.P=d||"";this.a=this.u=this.B=null}function X(a){return a?a.__styleInfo:null}function Mf(a,b){return a.__styleInfo=b}Lf.prototype.c=function(){return this.w};Lf.prototype._getStyleRules=Lf.prototype.c;var Nf,Of=window.Element.prototype;Nf=Of.matches||Of.matchesSelector||Of.mozMatchesSelector||Of.msMatchesSelector||Of.oMatchesSelector||Of.webkitMatchesSelector;var Pf=navigator.userAgent.match("Trident");function Qf(){}function Rf(a){var b={},c=[],d=0;af(a,function(a){Sf(a);a.index=d++;a=a.i.cssText;for(var c;c=Ve.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a} +function Sf(a){if(!a.i){var b={},c={};Tf(a,c)&&(b.v=c,a.rules=null);b.cssText=a.parsedCssText.replace(Ye,"").replace(Te,"");a.i=b}}function Tf(a,b){var c=a.i;if(c){if(c.v)return Object.assign(b,c.v),!0}else{c=a.parsedCssText;for(var d;a=Te.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}} +function Uf(a,b,c){b&&(b=0<=b.indexOf(";")?Vf(a,b,c):ff(b,function(b,e,f,h){if(!e)return b+h;(e=Uf(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Uf(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""} +function Vf(a,b,c){b=b.split(";");for(var d=0,e,f;d *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(R&&!b.m&&(b.m=rf(W,b,W.b,a?qf+a:"",e)),c=b.m||e),d({Xa:c,Qa:g,hb:h})}} +function Yf(a,b){var c={},d={},e=b&&b.__cssBuild;af(b,function(b){Xf(a,b,e,function(e){Nf.call(a.b||a,e.Xa)&&(e.Qa?Tf(b,c):Tf(b,d))})},null,!0);return{Wa:d,Oa:c}} +function Zf(a,b,c,d){var e=V(b),f=pf(e.is,e.P),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).w;var g=$f(e,d);return nf(b,e,function(b){var e="";b.i||Sf(b);b.i.cssText&&(e=Vf(a,b.i.cssText,c));b.cssText=e;if(!R&&!cf(b)&&b.cssText){var k=e=b.cssText;null==b.ra&&(b.ra=We.test(e));if(b.ra)if(null==b.W){b.W=[];for(var n in g)k=g[n],k=k(e),e!==k&&(e=k,b.W.push(n))}else{for(n=0;n=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));R?f.a?(f.a.textContent=e,d=f.a):e&&(d=df(e,g,a.shadowRoot,f.b)):d?d.parentNode|| +(Pf&&-1.\n var capturedCloneNode = Node.prototype.cloneNode;\n var capturedCreateElement = Document.prototype.createElement;\n var capturedImportNode = Document.prototype.importNode;\n var capturedRemoveChild = Node.prototype.removeChild;\n var capturedAppendChild = Node.prototype.appendChild;\n var capturedReplaceChild = Node.prototype.replaceChild;\n var capturedParseFromString = DOMParser.prototype.parseFromString;\n var capturedHTMLElementInnerHTML = Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML');\n var capturedChildNodes = Object.getOwnPropertyDescriptor(window.Node.prototype, 'childNodes');\n\n var elementQuerySelectorAll = Element.prototype.querySelectorAll;\n var docQuerySelectorAll = Document.prototype.querySelectorAll;\n var fragQuerySelectorAll = DocumentFragment.prototype.querySelectorAll;\n\n var scriptSelector = 'script:not([type]),script[type=\"application/javascript\"],script[type=\"text/javascript\"]';\n\n function QSA(node, selector) {\n // IE 11 throws a SyntaxError with `scriptSelector` if the node has no children due to the `:not([type])` syntax\n if (!node.childNodes.length) {\n return [];\n }\n switch (node.nodeType) {\n case Node.DOCUMENT_NODE:\n return docQuerySelectorAll.call(node, selector);\n case Node.DOCUMENT_FRAGMENT_NODE:\n return fragQuerySelectorAll.call(node, selector);\n default:\n return elementQuerySelectorAll.call(node, selector);\n }\n }\n\n // returns true if nested templates cannot be cloned (they cannot be on\n // some impl's like Safari 8 and Edge)\n // OR if cloning a document fragment does not result in a document fragment\n var needsCloning = (function() {\n if (!needsTemplate) {\n var t = document.createElement('template');\n var t2 = document.createElement('template');\n t2.content.appendChild(document.createElement('div'));\n t.content.appendChild(t2);\n var clone = t.cloneNode(true);\n return (clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0\n || brokenDocFragment);\n }\n })();\n\n var TEMPLATE_TAG = 'template';\n var PolyfilledHTMLTemplateElement = function() {};\n\n if (needsTemplate) {\n\n var contentDoc = document.implementation.createHTMLDocument('template');\n var canDecorate = true;\n\n var templateStyle = document.createElement('style');\n templateStyle.textContent = TEMPLATE_TAG + '{display:none;}';\n\n var head = document.head;\n head.insertBefore(templateStyle, head.firstElementChild);\n\n /**\n Provides a minimal shim for the