diff --git a/.gitignore b/.gitignore index 7c54a73..1a4aa9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,4 @@ .pioenvs .piolibdeps -src/credentials.h *.sublime-workspace -web/node_modules/ -web/update/ -src/version.h -web/version.js -web/static/bower_components/ +node_modules diff --git a/DEVELOPING.md b/DEVELOPING.md new file mode 100644 index 0000000..693ea78 --- /dev/null +++ b/DEVELOPING.md @@ -0,0 +1,57 @@ +# Stairs + +This Stairs firmware was developed using [PlatformIO Core](http://platformio.org/). You can probably use the PlatformIO IDE as well, although I have no experience using it, so this guide will only use the command line tools. + +## Programming the ESP8266 + +You can either use an ESP8266 module with built-in USB like the Wemos D1, a programming fixture (my method of choice, search for "esp8266 fixture" on Google or AliExpress) or wire it up yourself using a CH340 or FTDI USB-to-serial module. + +To upload the code, open a console, go to the Stairs folder and run: + +``` +platformio run -t upload +``` + +It should auto-detect the USB COM port. + + +## Frontend development + +The frontend is compiled into C++ source files so that all the files can be served directly from the ESP8266, since there is no internet connection when running in access point mode. These steps are performed by a [Gulp script](https://gulpjs.com/). The Gulp script also updates the version based on the [GitVersion](http://gitversion.readthedocs.io/en/stable/) of the working copy. + +Note that GitVersion requires Windows, so some changes are probably required if you want to build on a different platform. + +To get started: + +1. Install [Node.js](https://nodejs.org/en/) +1. Install the [GitVersion command line](http://gitversion.readthedocs.io/en/stable/usage/command-line/) tool +1. Open a command line and navigate to the Stairs folder +1. Run ```npm update``` to install all the dependencies + + +### Compiling the assets + +Run ```gulp``` to compile the SASS files, and embed the CSS, JavaScript, images and HTML into C++ header files located in the src\assets folder. + +You may need to run ```npm install -g gulp``` to install Gulp into the global Node packages. + + +### Development server + +To make it easier to develop the frontend, a development server is included which serves the webpages and acts as a mock service for the API. + +To start the development server, run: + +```node devserver.js``` + +You can now open the frontend on [http://localhost:3000/](http://localhost:3000/). + +If you make any changes to the SCSS files, make sure to run ```gulp compileSass``` and ```gulp compileJS``` to update the CSS/JS files so your changes are visible in the development server. To keep gulp running and watch for changes in the SCSS and JS files, run ```gulp watch``` + + +## Building and/or uploading + +To rebuild all the assets and compile or upload the source in one go, two tasks have been added to the gulpfile.js: + +1. ```gulp build``` first runs all the tasks run by a regular ```gulp```, then builds the source code using ```platformio run``` +1. ```gulp upload``` is similar, but executes ```platformio run -t upload``` to directly upload the newly compiled source to the ESP8266 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..46b9351 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# Stairs + +ESP8266 firmware for controlling up to 16 LED strips on a flight of stairs. + +## Features + +- Configurable using WiFi (can act as an access point or connect to a router) +- Turn on or off at specific times +- Turn on when movement is detected by connecting one or two PIR sensors +- ReST API for configuration and controlling the lights + +Most notably it does not support RGB LED strips out of the box, but feel free to add support if you're up to the task! + +## Further reading + +- [Wiring information](WIRING.md) +- [Programming the ESP8266 and/or modifying the source](DEVELOPING.md) \ No newline at end of file diff --git a/Stairs.sublime-project b/Stairs.sublime-project index 7d06507..a3375cb 100644 --- a/Stairs.sublime-project +++ b/Stairs.sublime-project @@ -5,18 +5,8 @@ "path": ".", "file_exclude_patterns": ["*.sublime-project"] } - ]/*, - "build_systems": - [ - { - "name": "PlatformIO - Build", - "cmd": ["platformio", "run"], - "working_dir": "$project_path" - }, - { - "name": "PlatformIO - Upload", - "cmd": ["platformio", "run", "--target", "upload"], - "working_dir": "$project_path" - } - ]*/ + ], + "completions":[ + ["t", "{{ \\$t('${1:}') }}"] + ] } \ No newline at end of file diff --git a/WIRING.md b/WIRING.md new file mode 100644 index 0000000..2def5e3 --- /dev/null +++ b/WIRING.md @@ -0,0 +1,4 @@ +## Bill of materials + +1. ESP8266 module (I based mine on a vanilla ESP8266 ESP-12F, but friendlier modules like the Wemos D1 should work as well) +1. PCA9685 16-channel PWM module \ No newline at end of file diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index 7969cc9..0000000 --- a/build.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -& .\updateversion.ps1 -& platformio run -Copy-Item .\.pioenvs\esp12e\firmware.bin .\web\update\ \ No newline at end of file diff --git a/case/StairCase.scad b/case/StairCase.scad deleted file mode 100644 index 74bcce5..0000000 --- a/case/StairCase.scad +++ /dev/null @@ -1,97 +0,0 @@ -caseBottom(); - -$fa = 1; -$fs = 1; - -module caseBottom() -{ - innerX = 80; - innerY = 70; - innerZ = 35; - wallThickness = 2; - - totalX = innerX + (2 * wallThickness); - totalY = innerY + (2 * wallThickness); - totalZ = innerZ + wallThickness; - - difference() - { - cube([totalX, totalY, totalZ]); - translate([wallThickness, wallThickness, wallThickness]) - cube([innerX, innerY, totalZ]); - - // Hole for the LED cables - translate([-1, totalY / 2, 25]) - rotate([0, 90, 0]) - cylinder(d = 15, h = wallThickness + 2); - - // Hole for the power cable - translate([62, totalY + 1, wallThickness + 2.5]) - rotate([90, 0, 0]) - cylinder(d = 5, h = wallThickness + 2); - } - - translate([wallThickness, wallThickness, wallThickness]) - { - translate([4, 4, 0]) - PCA9685Mount(); - - translate([40, 20, 0]) - ESP8266PlusPowerMount(); - } -} - - -module PCA9685Mount() -{ - totalX = 25.5; - totalY = 62.5; - pinDistanceX = 19; - pinDistanceY = 56; - pinDiameter = 2.3; - pinHeight = 3; - supportDiameter = 4; - supportHeight = 4; - - offsetX = (totalX - pinDistanceX) / 2; - offsetY = (totalY - pinDistanceY) / 2; - - for (x = [offsetX, offsetX + pinDistanceX]) - for (y = [offsetY, offsetY + pinDistanceY]) - translate([x, y, 0]) - { - cylinder(d = supportDiameter, h = supportHeight); - translate([0, 0, supportHeight]) - cylinder(d = pinDiameter, h = pinHeight); - } -} - - -// I didn't put any actual mount points in the perfboard, -// so I'll settle for some corner pieces to align it and -// use the ultimate maker's friend: hot glue. -module ESP8266PlusPowerMount() -{ - innerX = 34; - innerY = 35; - cornerSize = 6; - cornerThickness = 2; - cornerHeight = 2; - - totalX = innerX + (2 * cornerThickness); - totalY = innerY + (2 * cornerThickness); - - difference() - { - cube([totalX, totalY, cornerHeight]); - - translate([cornerThickness, cornerThickness, -1]) - cube([innerX, innerY, cornerHeight + 2]); - - translate([-1, cornerSize, -1]) - cube([totalX + 2, totalY - (2 * cornerSize), cornerHeight + 2]); - - translate([cornerSize, -1, -1]) - cube([totalX - (2 * cornerSize), totalY + 2, cornerHeight + 2]); - } -} \ No newline at end of file diff --git a/devserver.js b/devserver.js new file mode 100644 index 0000000..16aa45d --- /dev/null +++ b/devserver.js @@ -0,0 +1,60 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +const express = require('express'); +const app = express(); + +app.use(express.static('web')); +app.use(express.static('web/dist')); + +app.get('/api/version', function(req, res) +{ + res.send({ + systemID: 'dev-server', + version: 'dev-server' + }); +}); + +app.get('/api/connection', function(req, res) +{ + res.send({ + hostname: 'dev-server', + accesspoint: true, + station: true, + ssid: 'MyWiFiSSID', + password: 'supersecret', + dhcp: true, + ip: '192.168.1.234', + subnetmask: '255.255.255.0', + gateway: '192.168.1.0' + }); +}); + +app.get('/api/connection/status', function(req, res) +{ + res.send({ + "ap": { + "enabled": true, + "ip": "192.168.4.1" + }, + "station": { + "enabled": true, + "status": 1, + "ip": "0.0.0.0" + } + }); +}); + +app.post('/api/connection', function(req, res) +{ + res.sendStatus(200); +}); + +app.listen(3000, function() +{ + console.log('Development server listening on port 3000') + console.log('Press Ctrl-C to stop') +}); \ No newline at end of file diff --git a/docs/protocol.md b/docs/protocol.md deleted file mode 100644 index 2827f1f..0000000 --- a/docs/protocol.md +++ /dev/null @@ -1,170 +0,0 @@ -The Stairs firmware on the ESP8266 can be accessed using a custom light-weight UDP protocol. It is not intended to be accessed directly from the internet, and thus there is no security on the device itself. This is by design. Authentication should in my opinion be handled by a device with more processing power, such as a Raspberry Pi. - -A Node.js application is included which provides a ReST interface. It is also not intended to be accessible from the internet, and does not provide any authentication either! - - -Protocol -======== - -The default port for UDP communication is 3126. Every request message will result in a response message which is either an error, the requested information or a confirmation of the newly stored data. Each message should be a separate packet. - -16-bit (word) values are expected in little endian order (least significant byte first). - - -Request -------- - -The first byte of a request is the command. Further data depends on the command. - -| Command | Name | -| ------- | ---- | -| 0x01 | Ping | -| 0x03 | GetMode | -| 0x04 | SetMode | -| 0x05 | GetRange | -| 0x06 | SetRange | -| 0xFF | UpdateFirmware | - - -Response --------- - -A response is sent to the source address and port and starts with the Reply command. - -| Command | Name | -| ------- | ---- | -| 0x02 | Reply | - - -The second byte is the request command for which this reply is intended, or Error if the request command was not recognized or contained invalid parameters. - -| Command | Name | -| ------- | ---- | -| 0x00 | Error | - -In the case of an Error, the third byte will be the actual request command (or unrecognized value). - - -### Ping -A no-op command which can be used to tell if the device is responding. Returns the number of steps. - -Input parameters:
-_none_ - -Output parameters:
-**steps** (byte): The number of steps. - - -### GetMode -Returns the current mode. - -Input parameters:
-_none_ - -Output parameters:
-**mode** (byte): The identifier of the current mode. See Modes below.
-**data** (0..n bytes): The parameters specific to the current mode. See Modes below. - - -### SetMode -Changed the current mode. - -Input parameters:
-**mode** (byte): The identifier of the current mode.
-**data** (0..n bytes): The parameters specific to the current mode. - -Output parameters:
-_Same as input parameters_ - - -### GetRange -Gets the current range configuration. Each step has it's own parameters which adjust the PWM curve, which can be used to compensate for the differences in LED strips or signal strength. - -The ranges are stored on the ESP8266's filesystem and will be restored after a power loss. - -Input parameters:
-_none_ - -Output parameters:
-*useScaling* (byte): 0 (off) or 1 (on), default 1. If enabled, the brightness value will be converted to a PWM value using an exponential function. If disabled, the brightness is used as is (but still accounting for rangeStart/rangeEnd). -_repeated for each step:_
-*rangeStart* (word): value in range 0 (off) to 4095 (fully on), default 0. Determines the minimum PWM on value for a brightness of 1. -*rangeEnd* (word): value in range 0 (off) to 4095 (fully on), default 4094. Determines the maximum PWM on value for a brightness of 4094. - - -### SetRange -Sets the current range configuration. - -Input parameters:
-_See GetRange_ - -Output parameters:
-_Same as input parameters_ - - -### UpdateFirmware -Updates the firmware over WiFi. This functionality may be limited in the configuration which is hardcoded into the firmware. There are three modes of operation: - -1. Disabled, firmware can not be updated over WiFi -2. Enabled with a hardcoded URL. You may request an update check but any source provided will be ignored. -3. Enabled with the URL as input parameters. - -You can only request an update once every 5 seconds (by default), otherwise an error will be returned. - -Please note that the entire packet must not exceed 254 bytes or the remainder will be discarded. - - -For further information on implementing an update server, see [Arduino ESP8266's HTTPUpdate reference](https://github.com/esp8266/Arduino/blob/master/doc/ota_updates/readme.md#advanced-updater-1). - - -Input parameters:
-_If enabled_ -*port* (word): the port on which the HTTP update server runs -*host* (null-terminated string): the host name or IP address on which the HTTP update server runs -*path* (null-terminated string): the path to - -Output parameters:
-1 if succesful, 0 if no updates are available. - - -Modes -===== - -| Mode | Name | -| ---- | ---- | -| 0x01 | Static | -| 0x02 | Custom | -| 0x03 | Alternate | -| 0x04 | Slide | - -### Static -Sets all steps to the same brightness. - -Parameters:
-**brightness** (word): value in range 0 (off) to 4095 (fully on). -**easeTime** (word): the time in milliseconds to ease into the new brightness value (only applies if the mode was already set to static before). - - -### Custom -Sets the brightness for each of the steps individually. - -Parameters:
-**brightness** (word[stepCount]): array of brightness values in range 0 - 4095. The number of values must be equal to the number of steps are reported in the Ping response. Bottom step first. - - -### Alternate -Alternates between even and odd steps being lit. Bring out our next contestant! - -Parameters:
-**interval** (word): The time each set of steps is lit in milliseconds.
-**brightness** (word): value in range 0 (off) to 4095 (fully on). - - -### Slide -Lights one step at a time, moving up or down. - -Parameters:
-**interval** (word): How long each step is lit before moving to the next.
-**brightness** (word): value in range 0 (off) to 4095 (fully on). -**direction** (byte): Determines the starting step / direction. Either Bottom/Up (0) or Top/Down (1).
-**fadeOutTime** (word): If greater than 0 each step will fade out instead of turning off instantly after moving to the next. Specified in milliseconds. \ No newline at end of file diff --git a/gulp-cppstringify.js b/gulp-cppstringify.js new file mode 100644 index 0000000..bfc5ac1 --- /dev/null +++ b/gulp-cppstringify.js @@ -0,0 +1,168 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +'use strict'; + +// Borrowed heavily from gulp-concat: +// https://github.com/contra/gulp-concat/ +// +// It's very much hardcoded for the ESP8266 Arduino at the moment, +// but feel free to hack away at it if you need it for other purposes! +var through = require('through2'); +var path = require('path'); +var File = require('vinyl'); +var _ = require('lodash'); +var Readable = require('stream').Readable; + + +function escapeContent(content, lineLength) +{ + var lineRegexp = new RegExp('(.{1,' + (lineLength - 1) + '}[^\\\\])', 'g'); + + return content + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\r?\n/g, '\\r\\n') + .replace(lineRegexp, ' "$1"\r\n') + .replace(/\r\n$/, ''); +}; + + +function escapeContentAsByteArray(content, lineLength) +{ + var bytesPerLine = Math.floor(lineLength / 5); + var lineRegexp = new RegExp('((?:0x..,){1,' + bytesPerLine + '})', 'g'); + + return content + .replace(/(.{2})/g, '0x$1,') + .replace(lineRegexp, ' $1\r\n') + .replace(/,\r\n$/, ''); +}; + + +function encodeFile(file, opts) +{ + var variableName; + + if (opts.map.hasOwnProperty(file.relative)) + variableName = opts.map[file.relative]; + else + variableName = file.relative.replace(/[^a-zA-Z0-9_]/g, '_'); + + if (variableName === null) + return ''; + + variableName = opts.variablePrefix + variableName; + + var escapedContent; + var output; + + if (opts.byteArray) + { + escapedContent = escapeContentAsByteArray(file.contents.toString('hex'), opts.lineLength); + output = "const uint8_t " + variableName + "[] PROGMEM = {\r\n" + escapedContent + "};\r\n\r\n"; + } + else + { + escapedContent = escapeContent(file.contents.toString('utf-8'), opts.lineLength); + output = "const char " + variableName + "[] PROGMEM = \r\n" + escapedContent + ";\r\n\r\n"; + } + + return output; +} + + +module.exports = function(file, opts) +{ + if (!file) + throw new Error('gulp-cppstringify: Missing file option'); + + opts = _.extend({ + map: [], + headerDefineName: '__Embedded', + variablePrefix: 'Embedded', + lineLength: 100, + byteArray: false + }, opts || {}); + + var fileName; + var latestFile = false; + var latestMod = 0; + var output = null; + + + if (typeof file === 'string') + fileName = file; + else if (typeof file.path === 'string') + fileName = path.basename(file.path); + else + throw new Error('gulp-cppstringify: Missing path in file options'); + + + function bufferContents(file, enc, cb) + { + if (file.isNull()) + { + cb(); + return; + } + + if (file.isStream()) + { + this.emit('error', new Error('gulp-cppstringify: Streaming not supported')); + cb(); + return; + } + + if (!latestMod || file.stat && file.stat.mtime > latestMod) + { + latestFile = file; + latestMod = file.stat && file.stat.mtime; + } + + if (output == null) + { + output = new Readable(); + output._read = function noop() {}; + + output.push("#ifndef " + opts.headerDefineName + "\r\n"); + output.push("#define " + opts.headerDefineName + "\r\n\r\n"); + output.push("#include \r\n\r\n"); + } + + output.push(encodeFile(file, opts)); + cb(); + } + + + function endStream(cb) + { + if (!latestFile) + { + cb(); + return; + } + + var headerFile; + + if (typeof file === 'string') + { + headerFile = latestFile.clone({contents: false}); + headerFile.path = path.join(latestFile.base, file); + } + else + headerFile = new File(file); + + output.push("#endif\r\n"); + output.push(null); + headerFile.contents = output; + + this.push(headerFile); + cb(); + } + + return through.obj(bufferContents, endStream); +}; \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..1d9bc71 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,244 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +'use strict'; + +const gulp = require('gulp'); +const htmlmin = require('gulp-htmlmin'); +const cppstringify = require('./gulp-cppstringify'); +const fs = require('fs'); +const plumber = require('gulp-plumber'); +const sass = require('gulp-sass'); +const cleanCSS = require('gulp-clean-css'); +const watch = require('gulp-debounced-watch'); +const uglify = require('gulp-uglify'); +const concat = require('gulp-concat'); +const print = require('gulp-print'); + + +const config = { + assetsPath: 'web/', + distPath: 'web/dist/', + outputPath: 'src/assets/' +}; + + +const HTMLMap = { + 'index.html': 'Index' +}; + +const JSMap = { + 'bundle.js': 'BundleJS' +}; + +const CSSMap = { + 'bundle.css': 'BundleCSS' +}; + + +// There is an issue in the AsyncWebServer where it's apparantly running +// out of memory on simultaneous requests. We'll work around it by +// merging all the JS into one big file. +// +// https://github.com/me-no-dev/ESPAsyncWebServer/issues/256 +const JSSrc = [ + 'node_modules/axios/dist/axios.min.js', + 'node_modules/vue/dist/vue.min.js', + 'node_modules/vue-i18n/dist/vue-i18n.min.js', + 'web/lang.js', + 'web/app.js' +]; + +const SCSSSrc = [ + 'web/site.scss' +] + + + + +gulp.task('default', + [ + 'embedAssets' + ], + function(){}); + + +gulp.task('watch', + [ + 'compileScss', + 'compileJS' + ], + function() + { + watch(config.assetsPath + '*.scss', function() { gulp.start('compileScss'); }); + watch(config.assetsPath + '*.js', function() { gulp.start('compileJS'); }); + }); + + + +gulp.task('embedHTML', function() +{ + return gulp.src(config.assetsPath + '*.html') + .pipe(print(function(filepath) { return 'HTML: ' + filepath })) + .pipe(htmlmin({ + collapseWhitespace: true, + removeComments: true, + minifyCSS: true, + minifyJS: true + })) + .pipe(cppstringify('html.h', { + headerDefineName: '__assets_html', + map: HTMLMap + })) + .pipe(gulp.dest(config.outputPath)); +}); + + +gulp.task('compileScss', function() +{ + return gulp.src(SCSSSrc) + .pipe(plumber({ + errorHandler: function (error) + { + console.log(error.toString()); + this.emit('end'); + }})) + .pipe(print(function(filepath) { return 'SCSS: ' + filepath })) + .pipe(sass({ + includePaths: ['node_modules/milligram/src'] + })) + .pipe(cleanCSS({compatibility: 'ie9'})) + .pipe(concat('bundle.css')) + .pipe(gulp.dest(config.distPath)); +}); + + +gulp.task('compileJS', function() +{ + return gulp.src(JSSrc) + .pipe(plumber({ + errorHandler: function (error) + { + console.log(error.toString()); + this.emit('end'); + }})) + .pipe(print(function(filepath) { return 'JS: ' + filepath })) + .pipe(concat('bundle.js')) + .pipe(uglify()) + .pipe(gulp.dest(config.distPath)); +}); + + +gulp.task('embedJS', ['compileJS'], function() +{ + return gulp.src([config.distPath + 'bundle.js']) + .pipe(cppstringify('js.h', { + headerDefineName: '__assets_js', + map: JSMap + })) + .pipe(gulp.dest(config.outputPath)); +}); + + +gulp.task('embedCSS', ['compileScss'], function() +{ + return gulp.src([config.distPath + 'bundle.css']) + .pipe(cppstringify('css.h', { + headerDefineName: '__embed_css', + map: CSSMap + })) + .pipe(gulp.dest(config.outputPath)); +}); + + +gulp.task('embedVersion', function() +{ + var versionData = ''; + const cmd = spawn('gitversion'); + + cmd.stdout.on('data', function(data) + { + versionData += data; + }); + + cmd.stderr.on('data', function(data) + { + console.log(data.toString().trim()); + }); + + cmd.on('exit', function(code) + { + if (code != 0) return; + + var version = JSON.parse(versionData); + var headerFile = "#ifndef __assets_version\r\n"; + headerFile += "#define __assets_version\r\n\r\n"; + headerFile += "const uint8_t VersionMajor = " + version.Major + ";\r\n"; + headerFile += "const uint8_t VersionMinor = " + version.Minor + ";\r\n"; + headerFile += "const uint8_t VersionPatch = " + version.Patch + ";\r\n"; + headerFile += "const uint8_t VersionMetadata = " + version.BuildMetaData + ";\r\n"; + + headerFile += "const char VersionBranch[] = \"" + version.BranchName + "\";\r\n"; + headerFile += "const char VersionSha[] = \"" + version.Sha + "\";\r\n"; + + headerFile += "const char VersionSemVer[] = \"" + version.SemVer + "\";\r\n"; + headerFile += "const char VersionFullSemVer[] = \"" + version.FullSemVer + "\";\r\n"; + + headerFile += "const char VersionCommitDate[] = \"" + version.CommitDate + "\";\r\n"; + + headerFile += "\r\n#endif\r\n"; + + fs.writeFile(config.outputPath + 'version.h', headerFile, function(err) + { + if (err) throw err; + }); + }); +}); + + +gulp.task('embedAssets', ['embedHTML', 'embedJS', 'embedCSS', 'embedVersion'], function() { }) + + + +// PlatformIO +const spawn = require('child_process').spawn; +const argv = require('yargs').argv; + +var platformio = function(target) +{ + var args = ['run']; + if ("e" in argv) + { + args.push('-e'); + args.push(argv.e); + } + + if ("p" in argv) + { + args.push('--upload-port'); + args.push(argv.p); + } + + if (target) + { + args.push('-t'); + args.push(target); + } + + const cmd = spawn('platformio', args); + cmd.stdout.on('data', function(data) + { + console.log(data.toString().trim()); + }); + + cmd.stderr.on('data', function(data) + { + console.log(data.toString().trim()); + }); +} + +gulp.task('upload', ['embedHTML', 'embedAssets'], function() { platformio('upload'); }); +gulp.task('build', ['embedHTML', 'embedAssets'], function() { platformio(false); }); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..0731a34 --- /dev/null +++ b/package.json @@ -0,0 +1,40 @@ +{ + "name": "stairs", + "version": "2.0.0", + "description": "Stairs", + "main": "gulpfile.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "node devserver.js" + }, + "repository": { + "type": "git", + "url": "https://git.x2software.net/pub/Stairs.git" + }, + "author": "Mark van Renswoude ", + "license": "Unlicense", + "devDependencies": { + "axios": "^0.17.1", + "child_process": "^1.0.2", + "express": "^4.16.2", + "gulp": "^3.9.1", + "gulp-clean-css": "^3.9.0", + "gulp-concat": "^2.6.1", + "gulp-debounced-watch": "^1.0.4", + "gulp-htmlmin": "^3.0.0", + "gulp-plumber": "^1.1.0", + "gulp-print": "^2.0.1", + "gulp-sass": "^3.1.0", + "gulp-uglify": "^3.0.0", + "lodash": "^4.17.4", + "milligram": "^1.3.0", + "path": "^0.12.7", + "through2": "^2.0.3", + "vinyl": "^2.1.0", + "vue": "^2.5.13", + "yargs": "^10.0.3" + }, + "dependencies": { + "vue-i18n": "^7.3.3" + } +} diff --git a/platformio.ini b/platformio.ini index 36408bd..0c18779 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,7 +9,11 @@ ; http://docs.platformio.org/page/projectconf.html [env:esp12e] -platform = espressif8266_stage +platform = https://github.com/platformio/platform-espressif8266.git#feature/stage board = esp12e framework = arduino -upload_speed = 115200 \ No newline at end of file +upload_speed = 115200 +lib_deps = + Hash + ArduinoJson + ESP Async WebServer \ No newline at end of file diff --git a/src/assets/css.h b/src/assets/css.h new file mode 100644 index 0000000..12589ae --- /dev/null +++ b/src/assets/css.h @@ -0,0 +1,111 @@ +#ifndef __embed_css +#define __embed_css + +#include + +const char EmbeddedBundleCSS[] PROGMEM = + "*,:after,:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#606c76;fo" + "nt-family:Roboto,'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.6em;font-weight:300;letter-" + "spacing:.01em;line-height:1.6}blockquote{border-left:.3rem solid #404040;margin-left:0;margin-right:" + "0;padding:1rem 1.5rem}blockquote :last-child{margin-bottom:0}.button,button,input[type=button],input" + "[type=reset],input[type=submit]{background-color:#06f;border:.1rem solid #06f;border-radius:.4rem;co" + "lor:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-s" + "pacing:.1rem;line-height:3.8rem;padding:0 3rem;text-align:center;text-decoration:none;text-transform" + ":uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type=butto" + "n]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]" + ":focus,input[type=submit]:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}." + "button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[typ" + "e=submit][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button" + "[disabled]:focus,button[disabled]:hover,input[type=button][disabled]:focus,input[type=button][disabl" + "ed]:hover,input[type=reset][disabled]:focus,input[type=reset][disabled]:hover,input[type=submit][dis" + "abled]:focus,input[type=submit][disabled]:hover{background-color:#06f;border-color:#06f}.button.butt" + "on-outline,button.button-outline,input[type=button].button-outline,input[type=reset].button-outline," + "input[type=submit].button-outline{background-color:transparent;color:#06f}.button.button-outline:foc" + "us,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type=b" + "utton].button-outline:focus,input[type=button].button-outline:hover,input[type=reset].button-outline" + ":focus,input[type=reset].button-outline:hover,input[type=submit].button-outline:focus,input[type=sub" + "mit].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.bu" + "tton-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:" + "focus,button.button-outline[disabled]:hover,input[type=button].button-outline[disabled]:focus,input[" + "type=button].button-outline[disabled]:hover,input[type=reset].button-outline[disabled]:focus,input[t" + "ype=reset].button-outline[disabled]:hover,input[type=submit].button-outline[disabled]:focus,input[ty" + "pe=submit].button-outline[disabled]:hover{border-color:inherit;color:#06f}.button.button-clear,butto" + "n.button-clear,input[type=button].button-clear,input[type=reset].button-clear,input[type=submit].but" + "ton-clear{background-color:transparent;border-color:transparent;color:#06f}.button.button-clear:focu" + "s,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type=button]." + "button-clear:focus,input[type=button].button-clear:hover,input[type=reset].button-clear:focus,input[" + "type=reset].button-clear:hover,input[type=submit].button-clear:focus,input[type=submit].button-clear" + ":hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disa" + "bled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-c" + "lear[disabled]:hover,input[type=button].button-clear[disabled]:focus,input[type=button].button-clear" + "[disabled]:hover,input[type=reset].button-clear[disabled]:focus,input[type=reset].button-clear[disab" + "led]:hover,input[type=submit].button-clear[disabled]:focus,input[type=submit].button-clear[disabled]" + ":hover{color:#06f}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:." + "2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:.3rem solid #06f;overflow-y:hidden}" + "pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:.1" + "rem solid #f4f5f6;margin:3rem 0}input[type=email],input[type=number],input[type=password],input[type" + "=search],input[type=tel],input[type=text],input[type=url],select,textarea{appearance:none;background" + "-color:transparent;border:.1rem solid #404040;border-radius:.4rem;box-shadow:none;box-sizing:inherit" + ";height:3.8rem;padding:.6rem 1rem;width:100%}input[type=email]:focus,input[type=number]:focus,input[" + "type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[typ" + "e=url]:focus,select:focus,textarea:focus{border-color:#06f;outline:0}select{background:url('data:ima" + "ge/svg+xml;utf8,') center r" + "ight no-repeat;padding-right:3rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}labe" + "l,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;" + "padding:0}input[type=checkbox],input[type=radio]{display:inline}.label-inline{display:inline-block;f" + "ont-weight:400;margin-left:.5rem}.container{margin:0 auto;max-width:112rem;padding:0 2rem;position:r" + "elative;width:100%}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{" + "padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-item" + "s:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretc" + "h{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 aut" + "o;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column" + ".column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-" + "offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-le" + "ft:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column" + ".column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-" + "offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{f" + "lex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,." + "row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-w" + "idth:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-w" + "idth:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .co" + "lumn.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .co" + "lumn.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .colum" + "n .column-bottom{align-self:flex-end}.row .column .column-center{align-self:center}@media (min-width" + ":40rem){.row{flex-direction:row;margin-left:-1rem;width:calc(100% + 2rem)}.row .column{margin-bottom" + ":inherit;padding:0 1rem}}a{color:#06f;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{li" + "st-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font" + "-size:90%;margin:1.5rem 0 1.5rem 3rem}ol{list-style:decimal inside}ul{list-style:circle inside}.butt" + "on,button,dd,dt,li{margin-bottom:1rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote" + ",dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{borde" + "r-bottom:.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{pad" + "ding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:700}p{margin-top:0}h1,h" + "2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2rem;margin-top:0}h1{font-size:4.6" + "rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font" + "-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line" + "-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{" + "clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right}[v-cloak]{displ" + "ay:none}body{background-color:#000;color:#fff;font-family:Verdana,Arial,sans-serif;font-size:10pt;pa" + "dding-bottom:3rem}@media screen and (min-width:768px){body{padding-top:3rem}}input,textarea{color:#f" + "ff}#container{background-color:#202020;margin-top:2rem;padding:1rem;box-shadow:0 0 50px #fcf6cf;bord" + "er:solid 1px #000}@media screen and (min-width:768px){#container{width:768px;margin-left:auto;margin" + "-right:auto}}.header{position:relative}.header img{float:left;margin-right:1rem}.header .wifistatus{" + "position:absolute;right:0;top:0}.header .wifistatus .indicator{display:inline-block;width:1rem;heigh" + "t:1rem;border-radius:50%;margin-right:.5rem}.header .wifistatus .indicator[data-status=connected]{ba" + "ckground-color:#396}.header .wifistatus .indicator[data-status=disconnected]{border:solid 1px grey}." + "header .wifistatus .indicator[data-status=connecting]{background-color:#f93}.header .wifistatus .ind" + "icator[data-status=error]{background-color:#c00}h1{font-size:16pt;margin:0}h2{color:silver;font-size" + ":10pt;margin:0}h3{color:grey;background-color:#282828;font-size:14pt;border-bottom:solid 1px grey}.v" + "ersion{color:grey;font-size:8pt;text-align:center;margin-top:2rem}.tabs{clear:both;margin-top:3rem}." + "tabs .button{background-color:#404040;color:#fff!important;border-color:grey}.tabs .button.button-ou" + "tline{background-color:transparent}input[disabled]{cursor:not-allowed;color:grey;background-color:#2" + "62626}.label-inline{margin-right:2rem}.hint{display:block;font-size:8pt;color:grey;margin-bottom:1.5" + "rem}.loading{margin-top:3rem;text-align:center}.suboptions{margin-left:5rem}.buttons{text-align:cent" + "er}.slider{-webkit-appearance:none;width:100%;height:.5rem;border-radius:.25rem;background:#404040;o" + "utline:0}.slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:2rem;height:2re" + "m;border-radius:50%;background:#fcf6cf;cursor:pointer}.slider::-moz-range-thumb{width:2rem;height:2r" + "em;border-radius:50%;background:#fcf6cf;cursor:pointer}"; + +#endif diff --git a/src/assets/html.h b/src/assets/html.h new file mode 100644 index 0000000..17713c5 --- /dev/null +++ b/src/assets/html.h @@ -0,0 +1,59 @@ +#ifndef __assets_html +#define __assets_html + +#include + +const char EmbeddedIndex[] PROGMEM = + "

{{ $t('title') }}

{{ version.systemID !== null ? $t('systemID') + ': ' + version.syst" + "emID : '' }}

{{ $t('wifiStatus.accesspoint." + "title') }} {{ wifiStatus.ap.enabled ? wifiStatus.ap.ip : $t('wifiStatus.accesspoint.disabled') }}
" + "{{ $t('wifiStatus.stationmode.title') }} {{ getWiFiStationStatusText() }}
{{ $t('loading') }} {{ loadingIndicator }}

{{ $t('status.title') }}

{{ index + 1 }} {{ step.value }}

{{ $t('triggers.timeTitle') }}

{{ $t('triggers.motionTitle') }}

{{ $t('connection.title') }}

{{ $t('conn" + "ection.accesspointHint') }} {{ $t('connection.stationmodeHint') }} {{ $t('connection.dhc" + "pHint') }}
{{ $t('copyright') }}
{{ version.ve" + "rsion !== null ? $t('firmwareVersion') + version.version : '' }}
"; + +#endif diff --git a/src/assets/images.h b/src/assets/images.h new file mode 100644 index 0000000..51d9d72 --- /dev/null +++ b/src/assets/images.h @@ -0,0 +1,32 @@ +#ifndef __assets_images +#define __assets_images + +#include + +const uint8_t EmbeddedLogo[] PROGMEM = { + 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x30, + 0x00,0x00,0x00,0x30,0x08,0x06,0x00,0x00,0x00,0x57,0x02,0xf9,0x87,0x00,0x00,0x00,0x19,0x74,0x45,0x58, + 0x74,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x00,0x41,0x64,0x6f,0x62,0x65,0x20,0x49,0x6d,0x61,0x67, + 0x65,0x52,0x65,0x61,0x64,0x79,0x71,0xc9,0x65,0x3c,0x00,0x00,0x01,0x70,0x49,0x44,0x41,0x54,0x78,0xda, + 0xec,0x59,0xd1,0x0d,0x82,0x30,0x10,0x2d,0xc6,0x01,0x70,0x03,0xdc,0x00,0x27,0x50,0x37,0x80,0x0d,0xd8, + 0xc0,0xb8,0x81,0x1b,0x18,0x27,0xd1,0x0d,0x74,0x03,0xd8,0x00,0x36,0x80,0x0d,0xea,0x5d,0x52,0x13,0x35, + 0xa8,0x58,0xee,0xae,0x0a,0x7d,0x49,0xc3,0x07,0x81,0xde,0xf5,0xdd,0x5d,0xdf,0xb5,0x4a,0x79,0x78,0x78, + 0x0c,0x17,0x5a,0xeb,0x18,0x46,0xae,0xe9,0x51,0xc3,0xd8,0x73,0x1b,0x1f,0x9a,0x89,0x38,0xb1,0xeb,0x6b, + 0xe7,0xe4,0xcd,0xbb,0x18,0x46,0xc8,0x4c,0xf2,0x92,0xd3,0x81,0x42,0x20,0x4a,0x0b,0xee,0x30,0xca,0x18, + 0xc3,0xe8,0x8c,0x61,0x3a,0xfa,0x42,0x13,0x58,0x32,0xb3,0x62,0x37,0x2c,0x08,0x2e,0x5c,0x95,0x29,0xd7, + 0x32,0xc8,0xfb,0x26,0x71,0x1b,0x32,0x53,0x9d,0x24,0x80,0x7b,0x50,0x42,0xed,0x80,0x74,0xd2,0x45,0xa4, + 0x39,0x00,0x2b,0x82,0x3f,0x2c,0x85,0x8c,0x6f,0x60,0x2c,0x20,0x17,0x2a,0xd2,0x24,0x46,0x79,0x01,0x8f, + 0x4d,0x97,0xd5,0xe9,0x01,0x34,0xfa,0x00,0xc6,0x17,0x6a,0xe8,0xb0,0x61,0x20,0x31,0x0c,0x48,0x02,0x19, + 0xd9,0x02,0x23,0xcd,0xf3,0x8b,0xa9,0x45,0xfd,0x3f,0x3a,0x5a,0x6c,0x2c,0x20,0x69,0xdf,0x2a,0xb4,0x72, + 0x18,0x2d,0x09,0x45,0x19,0xad,0x1c,0x3a,0x40,0x33,0xb7,0x11,0x61,0xd2,0xa8,0x5f,0x6d,0x6a,0xb6,0x5a, + 0x48,0xa2,0x57,0x78,0x90,0xdd,0x6d,0x09,0x6c,0x13,0x42,0x83,0xe8,0x93,0x7f,0x2a,0x84,0x6c,0x1a,0x1c, + 0x57,0x28,0x29,0x42,0x28,0x72,0x48,0x7e,0x44,0xe1,0xc0,0xc5,0xa1,0x03,0xa7,0x41,0x4a,0x89,0x51,0x8a, + 0x39,0x09,0x39,0xdd,0x59,0x52,0xff,0x72,0x43,0xd3,0xa9,0xa9,0xb1,0xe9,0x89,0xa5,0x15,0x68,0x46,0xd9, + 0x13,0xbb,0x48,0x22,0x3a,0x01,0x29,0x7c,0xac,0xa2,0xcd,0x5c,0xe1,0x5f,0x1e,0x6c,0xb1,0x1d,0x6e,0xfd, + 0x9b,0x70,0xcb,0x04,0xee,0x08,0xee,0x05,0xdb,0xd7,0x45,0x22,0x78,0x17,0xef,0xf0,0xa8,0x85,0xd7,0xac, + 0x81,0xb0,0x99,0x7d,0xf3,0xc1,0xa7,0x0b,0x0e,0x17,0x8d,0x3b,0xdd,0x4e,0x8c,0xb4,0x0a,0x77,0x5e,0x15, + 0x30,0x30,0xa7,0x62,0x00,0xb1,0x56,0x32,0x37,0x35,0x37,0xb5,0x99,0x2a,0x0f,0x0f,0x8f,0x71,0xe1,0x2a, + 0xc0,0x00,0x6f,0x6a,0x3e,0x7e,0x1e,0xa2,0xf0,0x8c,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42, + 0x60,0x82}; + +#endif diff --git a/src/assets/js.h b/src/assets/js.h new file mode 100644 index 0000000..d2662c8 --- /dev/null +++ b/src/assets/js.h @@ -0,0 +1,1248 @@ +#ifndef __assets_js +#define __assets_js + +#include + +const char EmbeddedBundleJS[] PROGMEM = + "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"" + "==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.axios=e():t.axios=e()}(t" + "his,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},i" + "d:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t" + ",e.c=n,e.p=\"\",e(0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){\"use strict\";function r(t){" + "var e=new a(t),n=o(a.prototype.request,e);return i.extend(n,a.prototype,e),i.extend(n,e),n}var i=n(2" + "),o=n(3),a=n(5),s=n(6),c=r(s);c.Axios=a,c.create=function(t){return r(i.merge(s,t))},c.Cancel=n(23)," + "c.CancelToken=n(24),c.isCancel=n(20),c.all=function(t){return Promise.all(t)},c.spread=n(25),t.expor" + "ts=c,t.exports.default=c},function(t,e,n){\"use strict\";function r(t){return\"[object Array]\"===u." + "call(t)}function i(t){return null!==t&&\"object\"==typeof t}function o(t){return\"[object Function]" + "\"===u.call(t)}function a(t,e){if(null!==t&&void 0!==t)if(\"object\"!=typeof t&&(t=[t]),r(t))for(var" + " n=0,i=t.length;n=200&&t<300}};s.headers={common" + ":{Accept:\"application/json, text/plain, */*\"}},i.forEach([\"delete\",\"get\",\"head\"],function(t)" + "{s.headers[t]={}}),i.forEach([\"post\",\"put\",\"patch\"],function(t){s.headers[t]=i.merge(a)}),t.ex" + "ports=s},function(t,e,n){\"use strict\";var r=n(2);t.exports=function(t,e){r.forEach(t,function(n,r)" + "{r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])})}},function(t,e,n){\"use strict\";v" + "ar r=n(2),i=n(9),o=n(12),a=n(13),s=n(14),c=n(10),u=\"undefined\"!=typeof window&&window.btoa&&window" + ".btoa.bind(window)||n(15);t.exports=function(t){return new Promise(function(e,l){var f=t.data,p=t.he" + "aders;r.isFormData(f)&&delete p[\"Content-Type\"];var d=new XMLHttpRequest,h=\"onreadystatechange\"," + "v=!1;if(\"undefined\"==typeof window||!window.XDomainRequest||\"withCredentials\"in d||s(t.url)||(d=" + "new window.XDomainRequest,h=\"onload\",v=!0,d.onprogress=function(){},d.ontimeout=function(){}),t.au" + "th){var m=t.auth.username||\"\",g=t.auth.password||\"\";p.Authorization=\"Basic \"+u(m+\":\"+g)}if(d" + ".open(t.method.toUpperCase(),o(t.url,t.params,t.paramsSerializer),!0),d.timeout=t.timeout,d[h]=funct" + "ion(){if(d&&(4===d.readyState||v)&&(0!==d.status||d.responseURL&&0===d.responseURL.indexOf(\"file:\"" + "))){var n=\"getAllResponseHeaders\"in d?a(d.getAllResponseHeaders()):null,r={data:t.responseType&&\"" + "text\"!==t.responseType?d.response:d.responseText,status:1223===d.status?204:d.status,statusText:122" + "3===d.status?\"No Content\":d.statusText,headers:n,config:t,request:d};i(e,l,r),d=null}},d.onerror=f" + "unction(){l(c(\"Network Error\",t,null,d)),d=null},d.ontimeout=function(){l(c(\"timeout of \"+t.time" + "out+\"ms exceeded\",t,\"ECONNABORTED\",d)),d=null},r.isStandardBrowserEnv()){var y=n(16),_=(t.withCr" + "edentials||s(t.url))&&t.xsrfCookieName?y.read(t.xsrfCookieName):void 0;_&&(p[t.xsrfHeaderName]=_)}if" + "(\"setRequestHeader\"in d&&r.forEach(p,function(t,e){void 0===f&&\"content-type\"===e.toLowerCase()?" + "delete p[e]:d.setRequestHeader(e,t)}),t.withCredentials&&(d.withCredentials=!0),t.responseType)try{d" + ".responseType=t.responseType}catch(e){if(\"json\"!==t.responseType)throw e}\"function\"==typeof t.on" + "DownloadProgress&&d.addEventListener(\"progress\",t.onDownloadProgress),\"function\"==typeof t.onUpl" + "oadProgress&&d.upload&&d.upload.addEventListener(\"progress\",t.onUploadProgress),t.cancelToken&&t.c" + "ancelToken.promise.then(function(t){d&&(d.abort(),l(t),d=null)}),void 0===f&&(f=null),d.send(f)})}}," + "function(t,e,n){\"use strict\";var r=n(10);t.exports=function(t,e,n){var i=n.config.validateStatus;n" + ".status&&i&&!i(n.status)?e(r(\"Request failed with status code \"+n.status,n.config,null,n.request,n" + ")):t(n)}},function(t,e,n){\"use strict\";var r=n(11);t.exports=function(t,e,n,i,o){var a=new Error(t" + ");return r(a,e,n,i,o)}},function(t,e){\"use strict\";t.exports=function(t,e,n,r,i){return t.config=e" + ",n&&(t.code=n),t.request=r,t.response=i,t}},function(t,e,n){\"use strict\";function r(t){return enco" + "deURIComponent(t).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/g" + "i,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}var i=n(2);t.exports=fu" + "nction(t,e,n){if(!e)return t;var o;if(n)o=n(e);else if(i.isURLSearchParams(e))o=e.toString();else{va" + "r a=[];i.forEach(e,function(t,e){null!==t&&void 0!==t&&(i.isArray(t)&&(e+=\"[]\"),i.isArray(t)||(t=[" + "t]),i.forEach(t,function(t){i.isDate(t)?t=t.toISOString():i.isObject(t)&&(t=JSON.stringify(t)),a.pus" + "h(r(e)+\"=\"+r(t))}))}),o=a.join(\"&\")}return o&&(t+=(-1===t.indexOf(\"?\")?\"?\":\"&\")+o),t}},fun" + "ction(t,e,n){\"use strict\";var r=n(2),i=[\"age\",\"authorization\",\"content-length\",\"content-typ" + "e\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modi" + "fied\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agen" + "t\"];t.exports=function(t){var e,n,o,a={};return t?(r.forEach(t.split(\"\\n\"),function(t){if(o=t.in" + "dexOf(\":\"),e=r.trim(t.substr(0,o)).toLowerCase(),n=r.trim(t.substr(o+1)),e){if(a[e]&&i.indexOf(e)>" + "=0)return;a[e]=\"set-cookie\"===e?(a[e]?a[e]:[]).concat([n]):a[e]?a[e]+\", \"+n:n}}),a):a}},function" + "(t,e,n){\"use strict\";var r=n(2);t.exports=r.isStandardBrowserEnv()?function(){function t(t){var e=" + "t;return n&&(i.setAttribute(\"href\",e),e=i.href),i.setAttribute(\"href\",e),{href:i.href,protocol:i" + ".protocol?i.protocol.replace(/:$/,\"\"):\"\",host:i.host,search:i.search?i.search.replace(/^\\?/,\"" + "\"):\"\",hash:i.hash?i.hash.replace(/^#/,\"\"):\"\",hostname:i.hostname,port:i.port,pathname:\"/\"==" + "=i.pathname.charAt(0)?i.pathname:\"/\"+i.pathname}}var e,n=/(msie|trident)/i.test(navigator.userAgen" + "t),i=document.createElement(\"a\");return e=t(window.location.href),function(n){var i=r.isString(n)?" + "t(n):n;return i.protocol===e.protocol&&i.host===e.host}}():function(){return!0}},function(t,e){\"use" + " strict\";function n(){this.message=\"String contains an invalid character\"}var r=\"ABCDEFGHIJKLMNO" + "PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";n.prototype=new Error,n.prototype.code=5,n.prot" + "otype.name=\"InvalidCharacterError\",t.exports=function(t){for(var e,i,o=String(t),a=\"\",s=0,c=r;o." + "charAt(0|s)||(c=\"=\",s%1);a+=c.charAt(63&e>>8-s%1*8)){if((i=o.charCodeAt(s+=.75))>255)throw new n;e" + "=e<<8|i}return a}},function(t,e,n){\"use strict\";var r=n(2);t.exports=r.isStandardBrowserEnv()?{wri" + "te:function(t,e,n,i,o,a){var s=[];s.push(t+\"=\"+encodeURIComponent(e)),r.isNumber(n)&&s.push(\"expi" + "res=\"+new Date(n).toGMTString()),r.isString(i)&&s.push(\"path=\"+i),r.isString(o)&&s.push(\"domain=" + "\"+o),!0===a&&s.push(\"secure\"),document.cookie=s.join(\"; \")},read:function(t){var e=document.coo" + "kie.match(new RegExp(\"(^|;\\\\s*)(\"+t+\")=([^;]*)\"));return e?decodeURIComponent(e[3]):null},remo" + "ve:function(t){this.write(t,\"\",Date.now()-864e5)}}:{write:function(){},read:function(){return null" + "},remove:function(){}}},function(t,e,n){\"use strict\";function r(){this.handlers=[]}var i=n(2);r.pr" + "ototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1" + "},r.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},r.prototype.forEach=funct" + "ion(t){i.forEach(this.handlers,function(e){null!==e&&t(e)})},t.exports=r},function(t,e,n){\"use stri" + "ct\";function r(t){t.cancelToken&&t.cancelToken.throwIfRequested()}var i=n(2),o=n(19),a=n(20),s=n(6)" + ",c=n(21),u=n(22);t.exports=function(t){r(t),t.baseURL&&!c(t.url)&&(t.url=u(t.baseURL,t.url)),t.heade" + "rs=t.headers||{},t.data=o(t.data,t.headers,t.transformRequest),t.headers=i.merge(t.headers.common||{" + "},t.headers[t.method]||{},t.headers||{}),i.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"p" + "atch\",\"common\"],function(e){delete t.headers[e]});return(t.adapter||s.adapter)(t).then(function(e" + "){return r(t),e.data=o(e.data,e.headers,t.transformResponse),e},function(e){return a(e)||(r(t),e&&e." + "response&&(e.response.data=o(e.response.data,e.response.headers,t.transformResponse))),Promise.rejec" + "t(e)})}},function(t,e,n){\"use strict\";var r=n(2);t.exports=function(t,e,n){return r.forEach(n,func" + "tion(n){t=n(t,e)}),t}},function(t,e){\"use strict\";t.exports=function(t){return!(!t||!t.__CANCEL__)" + "}},function(t,e){\"use strict\";t.exports=function(t){return/^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.te" + "st(t)}},function(t,e){\"use strict\";t.exports=function(t,e){return e?t.replace(/\\/+$/,\"\")+\"/\"+" + "e.replace(/^\\/+/,\"\"):t}},function(t,e){\"use strict\";function n(t){this.message=t}n.prototype.to" + "String=function(){return\"Cancel\"+(this.message?\": \"+this.message:\"\")},n.prototype.__CANCEL__=!" + "0,t.exports=n},function(t,e,n){\"use strict\";function r(t){if(\"function\"!=typeof t)throw new Type" + "Error(\"executor must be a function.\");var e;this.promise=new Promise(function(t){e=t});var n=this;" + "t(function(t){n.reason||(n.reason=new i(t),e(n.reason))})}var i=n(23);r.prototype.throwIfRequested=f" + "unction(){if(this.reason)throw this.reason},r.source=function(){var t;return{token:new r(function(e)" + "{t=e}),cancel:t}},t.exports=r},function(t,e){\"use strict\";t.exports=function(t){return function(e)" + "{return t.apply(null,e)}}}])}),function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof modul" + "e?module.exports=e():\"function\"==typeof define&&define.amd?define(e):t.Vue=e()}(this,function(){\"" + "use strict\";function t(t){return void 0===t||null===t}function e(t){return void 0!==t&&null!==t}fun" + "ction n(t){return!0===t}function r(t){return\"string\"==typeof t||\"number\"==typeof t||\"symbol\"==" + "typeof t||\"boolean\"==typeof t}function i(t){return null!==t&&\"object\"==typeof t}function o(t){re" + "turn\"[object Object]\"===mn.call(t)}function a(t){var e=parseFloat(String(t));return e>=0&&Math.flo" + "or(e)===e&&isFinite(t)}function s(t){return null==t?\"\":\"object\"==typeof t?JSON.stringify(t,null," + "2):String(t)}function c(t){var e=parseFloat(t);return isNaN(e)?t:e}function u(t,e){for(var n=Object." + "create(null),r=t.split(\",\"),i=0;i-1)return t.sp" + "lice(n,1)}}function f(t,e){return _n.call(t,e)}function p(t){var e=Object.create(null);return functi" + "on(n){return e[n]||(e[n]=t(n))}}function d(t,e){function n(n){var r=arguments.length;return r?r>1?t." + "apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function h(t,e){e=e||0;for(var " + "n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function v(t,e){for(var n in e)t[n]=e[n];retur" + "n t}function m(t){for(var e={},n=0;n0&&(G((c=i(c,(a||\"\")+\"_\"+s))[0])&&G(l)&&(f[u]=k(l.text+c[0].text),c.shift()),f.push.ap" + "ply(f,c)):r(c)?G(l)?f[u]=k(l.text+c):\"\"!==c&&f.push(k(c)):G(c)&&G(l)?f[u]=k(l.text+c.text):(n(o._i" + "sVList)&&e(c.tag)&&t(c.key)&&e(a)&&(c.key=\"__vlist\"+a+\"_\"+s+\"__\"),f.push(c)));return f}(u):voi" + "d 0:c===Dr&&(s=function(t){for(var e=0;e=0||n.indexOf(t[i])<0" + ")&&r.push(t[i]);return r}return t}(n[o],r[o],i[o]));return e}(t);r&&v(t.extendOptions,r),(e=t.option" + "s=F(n,t.extendOptions)).name&&(e.components[e.name]=t)}}return e}function Et(t){this._init(t)}functi" + "on Lt(t){return t&&(t.Ctor.options.name||t.tag)}function It(t,e){return Array.isArray(t)?t.indexOf(e" + ")>-1:\"string\"==typeof t?t.split(\",\").indexOf(e)>-1:(n=t,!(\"[object RegExp]\"!==mn.call(n))&&t.t" + "est(e));var n}function Dt(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){va" + "r s=Lt(a.componentOptions);s&&!e(s)&&Ft(n,o,r,i)}}}function Ft(t,e,n,r){var i=t[e];!i||r&&i.tag===r." + "tag||i.componentInstance.$destroy(),t[e]=null,l(n,e)}function Nt(t,n){return{staticClass:Pt(t.static" + "Class,n.staticClass),class:e(t.class)?[t.class,n.class]:n.class}}function Pt(t,e){return t?e?t+\" \"" + "+e:t:e||\"\"}function Mt(t){return Array.isArray(t)?function(t){for(var n,r=\"\",i=0,o=t.length;i=0&&\" \"===(m=t.charAt(v));v--);m&&_i.test(m)||(l=!0)}}else void 0===o?(h=i+1,o=t.slice(0,i).t" + "rim()):e();if(void 0===o?o=t.slice(0,i).trim():0!==h&&e(),a)for(i=0;i-1?{exp:t.slice(0,zr),key:'\"'+t.slice(zr+1)+'\"'}:{exp:t,key:n" + "ull};for(Hr=t,zr=Wr=qr=0;!ce();)ue(Vr=se())?le(Vr):91===Vr&&function(t){var e=1;for(Wr=zr;!ce();)if(" + "t=se(),ue(t))le(t);else if(91===t&&e++,93===t&&e--,0===e){qr=zr;break}}(Vr);return{exp:t.slice(0,Wr)" + ",key:t.slice(Wr+1,qr)}}(t);return null===n.key?t+\"=\"+e:\"$set(\"+n.exp+\", \"+n.key+\", \"+e+\")\"" + "}function se(){return Hr.charCodeAt(++zr)}function ce(){return zr>=Ur}function ue(t){return 34===t||" + "39===t}function le(t){for(var e=t;!ce()&&(t=se())!==e;);}function fe(t,e,n,r,i){e=(o=e)._withTask||(" + "o._withTask=function(){hr=!0;var t=o.apply(null,arguments);return hr=!1,t}),n&&(e=function(t,e,n){va" + "r r=Jr;return function i(){null!==t.apply(null,arguments)&&pe(e,i,n,r)}}(e,t,r)),Jr.addEventListener" + "(t,e,Vn?{capture:r,passive:i}:r);var o}function pe(t,e,n,r){(r||Jr).removeEventListener(t,e._withTas" + "k||e,n)}function de(n,r){if(!t(n.data.on)||!t(r.data.on)){var i=r.data.on||{},o=n.data.on||{};Jr=r.e" + "lm,function(t){if(e(t[bi])){var n=Pn?\"change\":\"input\";t[n]=[].concat(t[bi],t[n]||[]),delete t[bi" + "]}e(t[wi])&&(t.change=[].concat(t[wi],t.change||[]),delete t[wi])}(i),J(i,o,fe,pe,r.context),Jr=void" + " 0}}function he(n,r){if(!t(n.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=n.data.domProps|" + "|{},u=r.data.domProps||{};e(u.__ob__)&&(u=r.data.domProps=v({},u));for(i in s)t(u[i])&&(a[i]=\"\");f" + "or(i in u){if(o=u[i],\"textContent\"===i||\"innerHTML\"===i){if(r.children&&(r.children.length=0),o=" + "==s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if(\"value\"===i){a._value=o" + ";var l=t(o)?\"\":String(o);p=l,!(f=a).composing&&(\"OPTION\"===f.tagName||function(t,e){var n=!0;try" + "{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(f,p)||function(t,n){var r=t.value,i=t" + "._vModifiers;if(e(i)){if(i.lazy)return!1;if(i.number)return c(r)!==c(n);if(i.trim)return r.trim()!==" + "n.trim()}return r!==n}(f,p))&&(a.value=l)}else a[i]=o}}var f,p}function ve(t){var e=me(t.style);retu" + "rn t.staticStyle?v(t.staticStyle,e):e}function me(t){return Array.isArray(t)?m(t):\"string\"==typeof" + " t?ki(t):t}function ge(n,r){var i=r.data,o=n.data;if(!(t(i.staticStyle)&&t(i.style)&&t(o.staticStyle" + ")&&t(o.style))){var a,s,c=r.elm,u=o.staticStyle,l=o.normalizedStyle||o.style||{},f=u||l,p=me(r.data." + "style)||{};r.data.normalizedStyle=e(p.__ob__)?v({},p):p;var d=function(t,e){for(var n,r={},i=t;i.com" + "ponentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=ve(i.data))&&v(r,n);(n=ve(t.data))&&v(r,n" + ");for(var o=t;o=o.parent;)o.data&&(n=ve(o.data))&&v(r,n);return r}(r);for(s in f)t(d[s])&&Si(c,s,\"" + "\");for(s in d)(a=d[s])!==f[s]&&Si(c,s,null==a?\"\":a)}}function ye(t,e){if(e&&(e=e.trim()))if(t.cla" + "ssList)e.indexOf(\" \")>-1?e.split(/\\s+/).forEach(function(e){return t.classList.add(e)}):t.classLi" + "st.add(e);else{var n=\" \"+(t.getAttribute(\"class\")||\"\")+\" \";n.indexOf(\" \"+e+\" \")<0&&t.set" + "Attribute(\"class\",(n+e).trim())}}function _e(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(\" " + "\")>-1?e.split(/\\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.cl" + "assList.length||t.removeAttribute(\"class\");else{for(var n=\" \"+(t.getAttribute(\"class\")||\"\")+" + "\" \",r=\" \"+e+\" \";n.indexOf(r)>=0;)n=n.replace(r,\" \");(n=n.trim())?t.setAttribute(\"class\",n)" + ":t.removeAttribute(\"class\")}}function be(t){if(t){if(\"object\"==typeof t){var e={};return!1!==t.c" + "ss&&v(e,Ei(t.name||\"v\")),v(e,t),e}return\"string\"==typeof t?Ei(t):void 0}}function we(t){Ri(funct" + "ion(){Ri(t)})}function $e(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&" + "&(n.push(e),ye(t,e))}function xe(t,e){t._transitionClasses&&l(t._transitionClasses,e),_e(t,e)}functi" + "on ke(t,e,n){var r=Ce(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ii?Ni:Mi,c=" + "0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout(f" + "unction(){c0&&(n=Ii,l=a,f=o.leng" + "th):e===Di?u>0&&(n=Di,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ii:Di:null)?n===Ii?o.length:c.len" + "gth:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ii&&Bi.test(r[Fi+\"Property\"])}}function Ae(t," + "e){for(;t.length1}function Le(t,e){!0!==e.data.show&&Oe(e)}function Ie(t,e,n){De(t,e,n),(Pn||Rn)&&se" + "tTimeout(function(){De(t,e,n)},0)}function De(t,e,n){var r=e.value,i=t.multiple;if(!i||Array.isArray" + "(r)){for(var o,a,s=0,c=t.options.length;s-1,a.selected!==o&&" + "(a.selected=o);else if(y(Ne(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));i||(t.select" + "edIndex=-1)}}function Fe(t,e){return e.every(function(e){return!y(e,t)})}function Ne(t){return\"_val" + "ue\"in t?t._value:t.value}function Pe(t){t.target.composing=!0}function Me(t){t.target.composing&&(t" + ".target.composing=!1,Re(t.target,\"input\"))}function Re(t,e){var n=document.createEvent(\"HTMLEvent" + "s\");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Be(t){return!t.componentInstance||t.data&&t.da" + "ta.transition?t:Be(t.componentInstance._vnode)}function Ue(t){var e=t&&t.componentOptions;return e&&" + "e.Ctor.options.abstract?Ue(Q(e.children)):t}function He(t){var e={},n=t.$options;for(var r in n.prop" + "sData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[wn(o)]=i[o];return e}function Ve(t,e){if(/" + "\\d-keep-alive$/.test(e.tag))return t(\"keep-alive\",{props:e.componentOptions.propsData})}function " + "ze(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function We(t){t.data.newPos=t" + ".elm.getBoundingClientRect()}function qe(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,i=e.top" + "-n.top;if(r||i){t.data.moved=!0;var o=t.elm.style;o.transform=o.WebkitTransform=\"translate(\"+r+\"p" + "x,\"+i+\"px)\",o.transitionDuration=\"0s\"}}function Je(t,e){var n=e?jo:To;return t.replace(n,functi" + "on(t){return Oo[t]})}function Ke(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:function(t){for(var" + " e={},n=0,r=t.length;n':'
',ko.innerHTML.indexOf(\" \")>0}var vn=Object.f" + "reeze({}),mn=Object.prototype.toString,gn=u(\"slot,component\",!0),yn=u(\"key,ref,slot,slot-scope,is" + "\"),_n=Object.prototype.hasOwnProperty,bn=/-(\\w)/g,wn=p(function(t){return t.replace(bn,function(t," + "e){return e?e.toUpperCase():\"\"})}),$n=p(function(t){return t.charAt(0).toUpperCase()+t.slice(1)})," + "xn=/\\B([A-Z])/g,kn=p(function(t){return t.replace(xn,\"-$1\").toLowerCase()}),Cn=function(t,e,n){re" + "turn!1},An=function(t){return t},Sn=\"data-server-rendered\",On=[\"component\",\"directive\",\"filte" + "r\"],Tn=[\"beforeCreate\",\"created\",\"beforeMount\",\"mounted\",\"beforeUpdate\",\"updated\",\"bef" + "oreDestroy\",\"destroyed\",\"activated\",\"deactivated\",\"errorCaptured\"],jn={optionMergeStrategie" + "s:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHa" + "ndler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:Cn,isReservedAttr:Cn,isUnkn" + "ownElement:Cn,getTagNamespace:g,parsePlatformTagName:An,mustUseProp:Cn,_lifecycleHooks:Tn},En=/[^\\w" + ".$]/,Ln=\"__proto__\"in{},In=\"undefined\"!=typeof window,Dn=\"undefined\"!=typeof WXEnvironment&&!!" + "WXEnvironment.platform,Fn=Dn&&WXEnvironment.platform.toLowerCase(),Nn=In&&window.navigator.userAgent" + ".toLowerCase(),Pn=Nn&&/msie|trident/.test(Nn),Mn=Nn&&Nn.indexOf(\"msie 9.0\")>0,Rn=Nn&&Nn.indexOf(\"" + "edge/\")>0,Bn=Nn&&Nn.indexOf(\"android\")>0||\"android\"===Fn,Un=Nn&&/iphone|ipad|ipod|ios/.test(Nn)" + "||\"ios\"===Fn,Hn=(Nn&&/chrome\\/\\d+/.test(Nn),{}.watch),Vn=!1;if(In)try{var zn={};Object.definePro" + "perty(zn,\"passive\",{get:function(){Vn=!0}}),window.addEventListener(\"test-passive\",null,zn)}catc" + "h(t){}var Wn,qn,Jn=function(){return void 0===Wn&&(Wn=!In&&\"undefined\"!=typeof global&&\"server\"=" + "==global.process.env.VUE_ENV),Wn},Kn=In&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Xn=\"undefined\"!=typeo" + "f Symbol&&x(Symbol)&&\"undefined\"!=typeof Reflect&&x(Reflect.ownKeys);qn=\"undefined\"!=typeof Set&" + "&x(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){" + "return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){thi" + "s.set=Object.create(null)},t}();var Gn=g,Zn=0,Yn=function(){this.id=Zn++,this.subs=[]};Yn.prototype." + "addSub=function(t){this.subs.push(t)},Yn.prototype.removeSub=function(t){l(this.subs,t)},Yn.prototyp" + "e.depend=function(){Yn.target&&Yn.target.addDep(this)},Yn.prototype.notify=function(){for(var t=this" + ".subs.slice(),e=0,n=t.length;eSr&&$r[n].id>t.id;)n--;$r.splice(n+1,0,t)}else $r.push(t" + ");Cr||(Cr=!0,z(ut))}}(this)},Tr.prototype.run=function(){if(this.active){var t=this.get();if(t!==thi" + "s.value||i(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}c" + "atch(t){B(t,this.vm,'callback for watcher \"'+this.expression+'\"')}else this.cb.call(this.vm,t,e)}}" + "},Tr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Tr.prototype.depend=function" + "(){for(var t=this.deps.length;t--;)this.deps[t].depend()},Tr.prototype.teardown=function(){if(this.a" + "ctive){this.vm._isBeingDestroyed||l(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.dep" + "s[t].removeSub(this);this.active=!1}};var jr={enumerable:!0,configurable:!0,get:g,set:g},Er={lazy:!0" + "};Ct(At.prototype);var Lr={init:function(t,n,r,i){if(!t.componentInstance||t.componentInstance._isDe" + "stroyed)(t.componentInstance=function(t,n,o,a){var s={_isComponent:!0,parent:wr,_parentVnode:t,_pare" + "ntElm:r||null,_refElm:i||null},c=t.data.inlineTemplate;return e(c)&&(s.render=c.render,s.staticRende" + "rFns=c.staticRenderFns),new t.componentOptions.Ctor(s)}(t)).$mount(n?t.elm:void 0,n);else if(t.data." + "keepAlive){var o=t;Lr.prepatch(o,o)}},prepatch:function(t,e){var n=e.componentOptions;!function(t,e," + "n,r,i){var o=!!(i||t.$options._renderChildren||r.data.scopedSlots||t.$scopedSlots!==vn);if(t.$option" + "s._parentVnode=r,t.$vnode=r,t._vnode&&(t._vnode.parent=r),t.$options._renderChildren=i,t.$attrs=r.da" + "ta&&r.data.attrs||vn,t.$listeners=n||vn,e&&t.$options.props){ar.shouldConvert=!1;for(var a=t._props," + "s=t.$options._propKeys||[],c=0;c1?h(n):n;for(var r=h(arguments,1),i=0" + ",o=n.length;iparseInt(this.max)&&Ft(a,s[0],s," + "this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={};e.get=function(){return" + " jn},Object.defineProperty(t,\"config\",e),t.util={warn:Gn,extend:v,mergeOptions:F,defineReactive:O}" + ",t.set=T,t.delete=j,t.nextTick=z,t.options=Object.create(null),On.forEach(function(e){t.options[e+\"" + "s\"]=Object.create(null)}),t.options._base=t,v(t.options.components,Br),t.use=function(t){var e=this" + "._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=h(arguments,1);" + "return n.unshift(this),\"function\"==typeof t.install?t.install.apply(t,n):\"function\"==typeof t&&t" + ".apply(null,n),e.push(t),this},t.mixin=function(t){return this.options=F(this.options,t),this},funct" + "ion(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,i=t._Ctor||(t._Ctor={});if(i[" + "r])return i[r];var o=t.name||n.options.name,a=function(t){this._init(t)};return(a.prototype=Object.c" + "reate(n.prototype)).constructor=a,a.cid=e++,a.options=F(n.options,t),a.super=n,a.options.props&&func" + "tion(t){var e=t.options.props;for(var n in e)lt(t.prototype,\"_props\",n)}(a),a.options.computed&&fu" + "nction(t){var e=t.options.computed;for(var n in e)ft(t.prototype,n,e[n])}(a),a.extend=n.extend,a.mix" + "in=n.mixin,a.use=n.use,On.forEach(function(t){a[t]=n[t]}),o&&(a.options.components[o]=a),a.superOpti" + "ons=n.options,a.extendOptions=t,a.sealedOptions=v({},a.options),i[r]=a,a}}(t),n=t,On.forEach(functio" + "n(t){n[t]=function(e,n){return n?(\"component\"===t&&o(n)&&(n.name=n.name||e,n=this.options._base.ex" + "tend(n)),\"directive\"===t&&\"function\"==typeof n&&(n={bind:n,update:n}),this.options[t+\"s\"][e]=n" + ",n):this.options[t+\"s\"][e]}});var n}(Et),Object.defineProperty(Et.prototype,\"$isServer\",{get:Jn}" + "),Object.defineProperty(Et.prototype,\"$ssrContext\",{get:function(){return this.$vnode&&this.$vnode" + ".ssrContext}}),Et.version=\"2.5.13\";var Ur,Hr,Vr,zr,Wr,qr,Jr,Kr,Xr=u(\"style,class\"),Gr=u(\"input," + "textarea,option,select,progress\"),Zr=function(t,e,n){return\"value\"===n&&Gr(t)&&\"button\"!==e||\"" + "selected\"===n&&\"option\"===t||\"checked\"===n&&\"input\"===t||\"muted\"===n&&\"video\"===t},Yr=u(" + "\"contenteditable,draggable,spellcheck\"),Qr=u(\"allowfullscreen,async,autofocus,autoplay,checked,co" + "mpact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,fo" + "rmnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade," + "novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,tran" + "slate,truespeed,typemustmatch,visible\"),ti=\"http://www.w3.org/1999/xlink\",ei=function(t){return\"" + ":\"===t.charAt(5)&&\"xlink\"===t.slice(0,5)},ni=function(t){return ei(t)?t.slice(6,t.length):\"\"},r" + "i=function(t){return null==t||!1===t},ii={svg:\"http://www.w3.org/2000/svg\",math:\"http://www.w3.or" + "g/1998/Math/MathML\"},oi=u(\"html,body,base,head,link,meta,style,title,address,article,aside,footer," + "header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol" + ",p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,st" + "rong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscr" + "ipt,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,labe" + "l,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary," + "content,element,shadow,template,blockquote,iframe,tfoot\"),ai=u(\"svg,animate,circle,clippath,cursor" + ",defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path," + "pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view\",!0),si=function(t){return" + " oi(t)||ai(t)},ci=Object.create(null),ui=u(\"text,number,password,search,email,tel,url\"),li=Object." + "freeze({createElement:function(t,e){var n=document.createElement(t);return\"select\"!==t?n:(e.data&&" + "e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute(\"multiple\",\"multiple\"),n)},createEl" + "ementNS:function(t,e){return document.createElementNS(ii[t],e)},createTextNode:function(t){return do" + "cument.createTextNode(t)},createComment:function(t){return document.createComment(t)},insertBefore:f" + "unction(t,e,n){t.insertBefore(e,n)},removeChild:function(t,e){t.removeChild(e)},appendChild:function" + "(t,e){t.appendChild(e)},parentNode:function(t){return t.parentNode},nextSibling:function(t){return t" + ".nextSibling},tagName:function(t){return t.tagName},setTextContent:function(t,e){t.textContent=e},se" + "tAttribute:function(t,e,n){t.setAttribute(e,n)}}),fi={create:function(t,e){Ut(e)},update:function(t," + "e){t.data.ref!==e.data.ref&&(Ut(t,!0),Ut(e))},destroy:function(t){Ut(t,!0)}},pi=new tr(\"\",{},[]),d" + "i=[\"create\",\"activate\",\"update\",\"remove\",\"destroy\"],hi={create:zt,update:zt,destroy:functi" + "on(t){zt(t,pi)}},vi=Object.create(null),mi=[fi,hi],gi={create:Jt,update:Jt},yi={create:Xt,update:Xt}" + ",_i=/[\\w).+\\-_$\\]]/,bi=\"__r\",wi=\"__c\",$i={create:de,update:de},xi={create:he,update:he},ki=p(" + "function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\\))/g).forEach(function(t){if(t){var r=t.sp" + "lit(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e}),Ci=/^--/,Ai=/\\s*!important$/,Si=function(t,e" + ",n){if(Ci.test(e))t.style.setProperty(e,n);else if(Ai.test(n))t.style.setProperty(e,n.replace(Ai,\"" + "\"),\"important\");else{var r=Ti(e);if(Array.isArray(n))for(var i=0,o=n.length;id?h(n,t(i[_+1])?null:i[_+1].elm,i,p,_,o):p>_&&m(0,r,f,d)}(c,p,d,o,s):e" + "(d)?(e(r.text)&&C.setTextContent(c,\"\"),h(c,null,d,0,d.length-1,o)):e(p)?m(0,p,0,p.length-1):e(r.te" + "xt)&&C.setTextContent(c,\"\"):r.text!==i.text&&C.setTextContent(c,i.text),e(l)&&e(u=l.hook)&&e(u=u.p" + "ostpatch)&&u(r,i)}}}function _(t,r,i){if(n(i)&&e(t.parent))t.parent.data.pendingInsert=r;else for(va" + "r o=0;o-1?ci[t]=e.constructor===window" + ".HTMLUnknownElement||e.constructor===window.HTMLElement:ci[t]=/HTMLUnknownElement/.test(e.toString()" + ")},v(Et.options.directives,Vi),v(Et.options.components,Ji),Et.prototype.__patch__=In?Ui:g,Et.prototy" + "pe.$mount=function(t,e){return function(t,e,n){t.$el=e,t.$options.render||(t.$options.render=nr),ct(" + "t,\"beforeMount\");return new Tr(t,function(){t._update(t._render(),n)},g,null,!0),n=!1,null==t.$vno" + "de&&(t._isMounted=!0,ct(t,\"mounted\")),t}(this,t=t&&In?Bt(t):void 0,e)},Et.nextTick(function(){jn.d" + "evtools&&Kn&&Kn.emit(\"init\",Et)},0);var Ki,Xi=/\\{\\{((?:.|\\n)+?)\\}\\}/g,Gi=/[-.*+?^${}()|[\\]" + "\\/\\\\]/g,Zi=p(function(t){var e=t[0].replace(Gi,\"\\\\$&\"),n=t[1].replace(Gi,\"\\\\$&\");return n" + "ew RegExp(e+\"((?:.|\\\\n)+?)\"+n,\"g\")}),Yi={staticKeys:[\"staticClass\"],transformNode:function(t" + ",e){e.warn;var n=ie(t,\"class\");n&&(t.staticClass=JSON.stringify(n));var r=re(t,\"class\",!1);r&&(t" + ".classBinding=r)},genData:function(t){var e=\"\";return t.staticClass&&(e+=\"staticClass:\"+t.static" + "Class+\",\"),t.classBinding&&(e+=\"class:\"+t.classBinding+\",\"),e}},Qi={staticKeys:[\"staticStyle" + "\"],transformNode:function(t,e){e.warn;var n=ie(t,\"style\");n&&(t.staticStyle=JSON.stringify(ki(n))" + ");var r=re(t,\"style\",!1);r&&(t.styleBinding=r)},genData:function(t){var e=\"\";return t.staticStyl" + "e&&(e+=\"staticStyle:\"+t.staticStyle+\",\"),t.styleBinding&&(e+=\"style:(\"+t.styleBinding+\"),\")," + "e}},to=u(\"area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr" + "\"),eo=u(\"colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source\"),no=u(\"address,article,aside,b" + "ase,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,foot" + "er,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,r" + "p,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track\"),ro=/^\\s*([^\\s\"'<>\\/=]+)(?:" + "\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/,io=\"[a-zA-Z_][\\\\w\\\\-\\\\.]*\",oo=\"" + "((?:\"+io+\"\\\\:)?\"+io+\")\",ao=new RegExp(\"^<\"+oo),so=/^\\s*(\\/?)>/,co=new RegExp(\"^<\\\\/\"+" + "oo+\"[^>]*>\"),uo=/^]+>/i,lo=/^/g,\"$1\").replace(//g,\"$1\")),Lo(p,n)&&(n=n.slice(1)" + "),e.chars&&e.chars(n),\"\"});l+=t.length-h.length,t=h,r(p,l-f,l)}else{var v=t.indexOf(\"<\");if(0===" + "v){if(lo.test(t)){var m=t.indexOf(\"--\\x3e\");if(m>=0){e.shouldKeepComment&&e.comment(t.substring(4" + ",m)),n(m+3);continue}}if(fo.test(t)){var g=t.indexOf(\"]>\");if(g>=0){n(g+2);continue}}var y=t.match" + "(uo);if(y){n(y[0].length);continue}var _=t.match(co);if(_){var b=l;n(_[0].length),r(_[1],b,l);contin" + "ue}var w=function(){var e=t.match(ao);if(e){var r={tagName:e[1],attrs:[],start:l};n(e[0].length);for" + "(var i,o;!(i=t.match(so))&&(o=t.match(ro));)n(o[0].length),r.attrs.push(o);if(i)return r.unarySlash=" + "i[1],n(i[0].length),r.end=l,r}}();if(w){!function(t){var n=t.tagName,i=t.unarySlash;s&&(\"p\"===o&&n" + "o(n)&&r(o),u(n)&&o===n&&r(n));for(var l=c(n)||!!i,f=t.attrs.length,p=new Array(f),d=0;d=0){for(x=t.slice(v);!(co.test(x)||ao.test(x)||lo.test(x)||fo.test(x)||(k" + "=x.indexOf(\"<\",1))<0);)v+=k,x=t.slice(v);$=t.substring(0,v),n(v)}v<0&&($=t,t=\"\"),e.chars&&$&&e.c" + "hars($)}if(t===i){e.chars&&e.chars(t);break}}r()}(t,{warn:ho,expectHTML:e.expectHTML,isUnaryTag:e.is" + "UnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecod" + "eNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,start:function(t,a,u){va" + "r l=i&&i.ns||wo(t);Pn&&\"svg\"===l&&(a=function(t){for(var e=[],n=0;nc&&(s.push(o=t.slice(" + "c,i)),a.push(JSON.stringify(o)));var u=Gt(r[1].trim());a.push(\"_s(\"+u+\")\"),s.push({\"@binding\":" + "u}),c=i+r[0].length}return c1?1:0:1:t?Math.min(t,2):0;va" + "r n}(e,n.length)]?n[e].trim():t}function a(t){return JSON.parse(JSON.stringify(t))}function s(t){for" + "(var n=arguments,r=Object(t),i=1;i=97&&e<=122||e>=65&&e<=90?\"ident\":e>=49&&e<=57?\"number\":\"else\"}funct" + "ion d(t){var e=t.trim();return(\"0\"!==t.charAt(0)||!isNaN(t))&&(n=e,N.test(n)?function(t){var e=t.c" + "harCodeAt(0);return e!==t.charCodeAt(t.length-1)||34!==e&&39!==e?t:t.slice(1,-1)}(e):\"*\"+e);var n}" + "var h,v=Object.prototype.toString,m=\"[object Object]\",g=Object.prototype.hasOwnProperty,y=\"undefi" + "ned\"!=typeof Intl&&void 0!==Intl.DateTimeFormat,_=\"undefined\"!=typeof Intl&&void 0!==Intl.NumberF" + "ormat,b={beforeCreate:function(){var t=this.$options;if(t.i18n=t.i18n||(t.__i18n?{}:null),t.i18n){if" + "(t.i18n instanceof M){if(t.__i18n)try{var e={};t.__i18n.forEach(function(t){e=s(e,JSON.parse(t))}),O" + "bject.keys(e).forEach(function(n){t.i18n.mergeLocaleMessage(n,e[n])})}catch(t){}this._i18n=t.i18n,th" + "is._i18nWatcher=this._i18n.watchI18nData(),this._i18n.subscribeDataChanging(this),this._subscribing=" + "!0}else if(n(t.i18n)){if(this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof M&&(t.i18n.root=t" + "his.$root.$i18n,t.i18n.fallbackLocale=this.$root.$i18n.fallbackLocale,t.i18n.silentTranslationWarn=t" + "his.$root.$i18n.silentTranslationWarn),t.__i18n)try{var r={};t.__i18n.forEach(function(t){r=s(r,JSON" + ".parse(t))}),t.i18n.messages=r}catch(t){}this._i18n=new M(t.i18n),this._i18nWatcher=this._i18n.watch" + "I18nData(),this._i18n.subscribeDataChanging(this),this._subscribing=!0,(void 0===t.i18n.sync||t.i18n" + ".sync)&&(this._localeWatcher=this.$i18n.watchLocale())}}else this.$root&&this.$root.$i18n&&this.$roo" + "t.$i18n instanceof M?(this._i18n=this.$root.$i18n,this._i18n.subscribeDataChanging(this),this._subsc" + "ribing=!0):t.parent&&t.parent.$i18n&&t.parent.$i18n instanceof M&&(this._i18n=t.parent.$i18n,this._i" + "18n.subscribeDataChanging(this),this._subscribing=!0)},beforeDestroy:function(){this._i18n&&(this._s" + "ubscribing&&(this._i18n.unsubscribeDataChanging(this),delete this._subscribing),this._i18nWatcher&&(" + "this._i18nWatcher(),delete this._i18nWatcher),this._localeWatcher&&(this._localeWatcher(),delete thi" + "s._localeWatcher),this._i18n=null)}},w={name:\"i18n\",functional:!0,props:{tag:{type:String,default:" + "\"span\"},path:{type:String,required:!0},locale:{type:String},places:{type:[Array,Object]}},render:f" + "unction(e,n){var r=n.props,i=n.data,o=n.children,a=n.parent.$i18n;if(o=(o||[]).filter(function(t){re" + "turn t.tag||(t.text=t.text.trim())}),!a)return o;var s=r.path,c=r.locale,u={},l=r.places||{},f=Array" + ".isArray(l)?l.length>0:Object.keys(l).length>0,p=o.every(function(t){if(t.data&&t.data.attrs){var e=" + "t.data.attrs.place;return void 0!==e&&\"\"!==e}});return f&&o.length>0&&!p&&t(\"If places prop is se" + "t, all child elements must have place prop set.\"),Array.isArray(l)?l.forEach(function(t,e){u[e]=t})" + ":Object.keys(l).forEach(function(t){u[t]=l[t]}),o.forEach(function(t,e){var n=p?\"\"+t.data.attrs.pl" + "ace:\"\"+e;u[n]=t}),e(r.tag,i,a.i(s,c,u))}},$=function(){this._caches=Object.create(null)};$.prototy" + "pe.interpolate=function(t,n){var r=this._caches[t];return r||(r=function(t){for(var e=[],n=0,r=\"\";" + "n0)f--,l=j,h[C]();else{if(f=0,!1===(n=d(n)))return!1;h[A]()}};null!==l;)if" + "(u++,\"\\\\\"!==(e=t[u])||!function(){var e=t[u+1];if(l===E&&\"'\"===e||l===L&&'\"'===e)return u++,r" + "=\"\\\\\"+e,h[C](),!0}()){if(i=p(e),(o=(s=F[l])[i]||s.else||D)===D)return;if(l=o[0],(a=h[o[1]])&&(r=" + "o[2],r=void 0===r?e:r,!1===a()))return;if(l===I)return c}}(t))&&(this._cache[t]=e),e||[]},P.prototyp" + "e.getPathValue=function(t,n){if(!e(t))return null;var r=this.parsePath(n);if(i=r,Array.isArray(i)&&0" + "===i.length)return null;for(var i,o=r.length,a=t,s=0;s-1)t.splice(n,1)}}(this._dataListene" + "rs,t)},M.prototype.watchI18nData=function(){var t=this;return this._vm.$watch(\"$data\",function(){f" + "or(var e=t._dataListeners.length;e--;)h.nextTick(function(){t._dataListeners[e]&&t._dataListeners[e]" + ".$forceUpdate()})},{deep:!0})},M.prototype.watchLocale=function(){if(!this._sync||!this._root)return" + " null;var t=this._vm;return this._root.vm.$watch(\"locale\",function(e){t.$set(t,\"locale\",e),t.$fo" + "rceUpdate()},{immediate:!0})},R.vm.get=function(){return this._vm},R.messages.get=function(){return " + "a(this._getMessages())},R.dateTimeFormats.get=function(){return a(this._getDateTimeFormats())},R.num" + "berFormats.get=function(){return a(this._getNumberFormats())},R.locale.get=function(){return this._v" + "m.locale},R.locale.set=function(t){this._vm.$set(this._vm,\"locale\",t)},R.fallbackLocale.get=functi" + "on(){return this._vm.fallbackLocale},R.fallbackLocale.set=function(t){this._vm.$set(this._vm,\"fallb" + "ackLocale\",t)},R.missing.get=function(){return this._missing},R.missing.set=function(t){this._missi" + "ng=t},R.formatter.get=function(){return this._formatter},R.formatter.set=function(t){this._formatter" + "=t},R.silentTranslationWarn.get=function(){return this._silentTranslationWarn},R.silentTranslationWa" + "rn.set=function(t){this._silentTranslationWarn=t},M.prototype._getMessages=function(){return this._v" + "m.messages},M.prototype._getDateTimeFormats=function(){return this._vm.dateTimeFormats},M.prototype." + "_getNumberFormats=function(){return this._vm.numberFormats},M.prototype._warnDefault=function(t,e,n," + "i){return r(n)?(this.missing&&this.missing.apply(null,[t,e,i]),e):n},M.prototype._isFallbackRoot=fun" + "ction(t){return!t&&!r(this._root)&&this._fallbackRoot},M.prototype._interpolate=function(t,e,i,o,a,s" + "){if(!e)return null;var c=this._path.getPathValue(e,i);if(Array.isArray(c))return c;var u;if(r(c)){i" + "f(!n(e))return null;if(\"string\"!=typeof(u=e[i]))return null}else{if(\"string\"!=typeof c)return nu" + "ll;u=c}return u.indexOf(\"@:\")>=0&&(u=this._link(t,e,u,o,a,s)),s?this._render(u,a,s):u},M.prototype" + "._link=function(t,e,n,r,i,o){var a=n,s=a.match(/(@:[\\w\\-_|.]+)/g);for(var c in s)if(s.hasOwnProper" + "ty(c)){var u=s[c],l=u.substr(2),f=this._interpolate(t,e,l,r,\"raw\"===i?\"string\":i,\"raw\"===i?voi" + "d 0:o);if(this._isFallbackRoot(f)){if(!this._root)throw Error(\"unexpected error\");var p=this._root" + ";f=p._translate(p._getMessages(),p.locale,p.fallbackLocale,l,r,i,o)}a=(f=this._warnDefault(t,l,f,r))" + "?a.replace(u,f):a}return a},M.prototype._render=function(t,e,n){var r=this._formatter.interpolate(t," + "n);return\"string\"===e?r.join(\"\"):r},M.prototype._translate=function(t,e,n,i,o,a,s){var c=this._i" + "nterpolate(e,t[e],i,o,a,s);return r(c)?r(c=this._interpolate(n,t[n],i,o,a,s))?null:c:c},M.prototype." + "_t=function(t,e,n,r){for(var o=[],a=arguments.length-4;a-- >0;)o[a]=arguments[a+4];if(!t)return\"\";" + "var s=i.apply(void 0,o),c=s.locale||e,u=this._translate(n,c,this.fallbackLocale,t,r,\"string\",s.par" + "ams);if(this._isFallbackRoot(u)){if(!this._root)throw Error(\"unexpected error\");return(l=this._roo" + "t).t.apply(l,[t].concat(o))}return this._warnDefault(c,t,u,r);var l},M.prototype.t=function(t){for(v" + "ar e=[],n=arguments.length-1;n-- >0;)e[n]=arguments[n+1];return(r=this)._t.apply(r,[t,this.locale,th" + "is._getMessages(),null].concat(e));var r},M.prototype._i=function(t,e,n,r,i){var o=this._translate(n" + ",e,this.fallbackLocale,t,r,\"raw\",i);if(this._isFallbackRoot(o)){if(!this._root)throw Error(\"unexp" + "ected error\");return this._root.i(t,e,i)}return this._warnDefault(e,t,o,r)},M.prototype.i=function(" + "t,e,n){return t?(\"string\"!=typeof e&&(e=this.locale),this._i(t,e,this._getMessages(),null,n)):\"\"" + "},M.prototype._tc=function(t,e,n,r,i){for(var a=[],s=arguments.length-5;s-- >0;)a[s]=arguments[s+5];" + "return t?(void 0===i&&(i=1),o((c=this)._t.apply(c,[t,e,n,r].concat(a)),i)):\"\";var c},M.prototype.t" + "c=function(t,e){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];return(i=this)._tc.app" + "ly(i,[t,this.locale,this._getMessages(),null,e].concat(n));var i},M.prototype._te=function(t,e,n){fo" + "r(var r=[],o=arguments.length-3;o-- >0;)r[o]=arguments[o+3];var a=i.apply(void 0,r).locale||e;return" + " this._exist(n[a],t)},M.prototype.te=function(t,e){return this._te(t,this.locale,this._getMessages()" + ",e)},M.prototype.getLocaleMessage=function(t){return a(this._vm.messages[t]||{})},M.prototype.setLoc" + "aleMessage=function(t,e){this._vm.messages[t]=e},M.prototype.mergeLocaleMessage=function(t,e){this._" + "vm.messages[t]=h.util.extend(this._vm.messages[t]||{},e)},M.prototype.getDateTimeFormat=function(t){" + "return a(this._vm.dateTimeFormats[t]||{})},M.prototype.setDateTimeFormat=function(t,e){this._vm.date" + "TimeFormats[t]=e},M.prototype.mergeDateTimeFormat=function(t,e){this._vm.dateTimeFormats[t]=h.util.e" + "xtend(this._vm.dateTimeFormats[t]||{},e)},M.prototype._localizeDateTime=function(t,e,n,i,o){var a=e," + "s=i[a];if((r(s)||r(s[o]))&&(a=n,s=i[a]),r(s)||r(s[o]))return null;var c=s[o],u=a+\"__\"+o,l=this._da" + "teTimeFormatters[u];return l||(l=this._dateTimeFormatters[u]=new Intl.DateTimeFormat(a,c)),l.format(" + "t)},M.prototype._d=function(t,e,n){if(!n)return new Intl.DateTimeFormat(e).format(t);var r=this._loc" + "alizeDateTime(t,e,this.fallbackLocale,this._getDateTimeFormats(),n);if(this._isFallbackRoot(r)){if(!" + "this._root)throw Error(\"unexpected error\");return this._root.d(t,n,e)}return r||\"\"},M.prototype." + "d=function(t){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];var i=this.locale,o=null" + ";return 1===n.length?\"string\"==typeof n[0]?o=n[0]:e(n[0])&&(n[0].locale&&(i=n[0].locale),n[0].key&" + "&(o=n[0].key)):2===n.length&&(\"string\"==typeof n[0]&&(o=n[0]),\"string\"==typeof n[1]&&(i=n[1])),t" + "his._d(t,i,o)},M.prototype.getNumberFormat=function(t){return a(this._vm.numberFormats[t]||{})},M.pr" + "ototype.setNumberFormat=function(t,e){this._vm.numberFormats[t]=e},M.prototype.mergeNumberFormat=fun" + "ction(t,e){this._vm.numberFormats[t]=h.util.extend(this._vm.numberFormats[t]||{},e)},M.prototype._lo" + "calizeNumber=function(t,e,n,i,o){var a=e,s=i[a];if((r(s)||r(s[o]))&&(a=n,s=i[a]),r(s)||r(s[o]))retur" + "n null;var c=s[o],u=a+\"__\"+o,l=this._numberFormatters[u];return l||(l=this._numberFormatters[u]=ne" + "w Intl.NumberFormat(a,c)),l.format(t)},M.prototype._n=function(t,e,n){if(!n)return new Intl.NumberFo" + "rmat(e).format(t);var r=this._localizeNumber(t,e,this.fallbackLocale,this._getNumberFormats(),n);if(" + "this._isFallbackRoot(r)){if(!this._root)throw Error(\"unexpected error\");return this._root.n(t,n,e)" + "}return r||\"\"},M.prototype.n=function(t){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[" + "r+1];var i=this.locale,o=null;return 1===n.length?\"string\"==typeof n[0]?o=n[0]:e(n[0])&&(n[0].loca" + "le&&(i=n[0].locale),n[0].key&&(o=n[0].key)):2===n.length&&(\"string\"==typeof n[0]&&(o=n[0]),\"strin" + "g\"==typeof n[1]&&(i=n[1])),this._n(t,i,o)},Object.defineProperties(M.prototype,R),M.availabilities=" + "{dateTimeFormat:y,numberFormat:_},M.install=function t(e){(h=e).version&&Number(h.version.split(\"." + "\")[0]),t.installed=!0,Object.defineProperty(h.prototype,\"$i18n\",{get:function(){return this._i18n" + "}}),n=h,Object.defineProperty(n.prototype,\"$t\",{get:function(){var t=this;return function(e){for(v" + "ar n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];var i=t.$i18n;return i._t.apply(i,[e,i.loca" + "le,i._getMessages(),t].concat(n))}}}),Object.defineProperty(n.prototype,\"$tc\",{get:function(){var " + "t=this;return function(e,n){for(var r=[],i=arguments.length-2;i-- >0;)r[i]=arguments[i+2];var o=t.$i" + "18n;return o._tc.apply(o,[e,o.locale,o._getMessages(),t,n].concat(r))}}}),Object.defineProperty(n.pr" + "ototype,\"$te\",{get:function(){var t=this;return function(e,n){var r=t.$i18n;return r._te(e,r.local" + "e,r._getMessages(),n)}}}),Object.defineProperty(n.prototype,\"$d\",{get:function(){var t=this;return" + " function(e){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(i=t.$i18n).d.apply" + "(i,[e].concat(n));var i}}}),Object.defineProperty(n.prototype,\"$n\",{get:function(){var t=this;retu" + "rn function(e){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(i=t.$i18n).n.app" + "ly(i,[e].concat(n));var i}}}),h.mixin(b),h.directive(\"t\",{bind:c,update:u}),h.component(w.name,w);" + "var n,r=h.config.optionMergeStrategies;r.i18n=r.methods},M.version=\"7.3.3\",\"undefined\"!=typeof w" + "indow&&window.Vue&&window.Vue.use(M),M});var messages={en:{title:\"Stairs\",systemID:\"System ID\",f" + "irmwareVersion:\"Firmware version: \",copyright:\"Copyright © 2017 Mark van Renswoude\",loading:\"Pl" + "ease wait, loading configuration...\",applyButton:\"Apply\",applyButtonSaving:\"Saving...\",wifiStat" + "us:{accesspoint:{title:\"AP: \",disabled:\"Disabled\"},stationmode:{title:\"WiFi: \",disabled:\"Disa" + "bled\",idle:\"Idle\",noSSID:\"SSID not found\",scanCompleted:\"Scan completed\",connectFailed:\"Fail" + "ed to connect\",connectionLost:\"Connection lost\",disconnected:\"Disconnected\"}},status:{tabTitle:" + "\"Status\",title:\"Current status\"},triggers:{tabTitle:\"Triggers\",timeTitle:\"Time\",motionTitle:" + "\"Motion\"},connection:{tabTitle:\"Connection\",title:\"Connection parameters\",accesspoint:\"Enable" + " access point\",accesspointHint:\"Allows for a direct connection from your device to this Stairs mod" + "ule for configuration purposes. The Stairs configuration is available on http://192.168.1.4/ when yo" + "u are connected to it. Turn it off as soon as station mode is configured, as it is not secured in an" + "y way. You can always turn this option back on by pushing the access point button until the LED ligh" + "ts up.\",stationmode:\"Enable station mode\",stationmodeHint:\"Connect this Stairs module to your ow" + "n WiFi router. Please enter the SSID, password and further configuration below.\",ssid:\"SSID\",pass" + "word:\"Password\",dhcp:\"Use DHCP\",dhcpHint:\"Automatically assigns an IP address to this Stairs mo" + "dule. You probably want to keep this on unless you know what you're doing.\",ipaddress:\"IP address" + "\",subnetmask:\"Subnet mask\",gateway:\"Gateway\",hostname:\"Hostname\",hostnamePlaceholder:\"Defaul" + "t: mac address\"}},nl:{title:\"Trap\",systemID:\"Systeem ID\",firmwareVersion:\"Firmware versie: \"," + "copyright:\"Copyright © 2017 Mark van Renswoude\",loading:\"Een ogenblik geduld, bezig met laden van" + " configuratie...\",applyButton:\"Apply\",applyButtonSaving:\"Saving...\",wifiStatus:{accesspoint:{ti" + "tle:\"AP: \",disabled:\"Uitgeschakeld\"},stationmode:{title:\"WiFi: \",disabled:\"Uitgeschakeld\",id" + "le:\"Slaapstand\",noSSID:\"SSID niet gevonden\",scanCompleted:\"Scan afgerond\",connectFailed:\"Kan " + "geen verbinding maken\",connectionLost:\"Verbinding verloren\",disconnected:\"Niet verbonden\"}},sta" + "tus:{tabTitle:\"Status\",title:\"Huidige status\"},triggers:{tabTitle:\"Triggers\",timeTitle:\"Tijd" + "\",motionTitle:\"Beweging\"},connection:{tabTitle:\"Verbinding\",title:\"Verbinding configuratie\",a" + "ccesspoint:\"Access point inschakelen\",accesspointhint:\"Maakt het mogelijk om een directe connecti" + "e vanaf een apparaat naar deze Trap module te maken om de module te configureren. De Trap module is " + "te benaderen via http://192.168.1.4/ nadat je connectie hebt gemaakt. Schakel deze optie uit na het " + "configureren, aangezien deze niet beveiligd is. Je kunt deze optie ook inschakelen door op de Access" + " point knop te drukken totdat de LED aan gaat.\",stationmode:\"Verbinding met WiFi maken\",stationmo" + "dehint:\"Verbind deze Trap module aan je eigen WiFi router. Vul hieronder het SSID en wachtwoord in," + " en configureer eventuel de overige opties.\",ssid:\"SSID\",password:\"Wachtwoord\",dhcp:\"Gebruik D" + "HCP\",dhcphint:\"Automatisch een IP adres toewijzen aan deze Trap module. Waarschijnlijk wil je deze" + " optie aan laten, tenzij je weet waar je mee bezig bent.\",ipaddress:\"IP adres\",subnetmask:\"Subne" + "t masker\",gateway:\"Gateway\",hostname:\"Hostnaam\",hostnamePlaceholder:\"Standaard: mac adres\"}}}" + ";function startApp(){var t=new VueI18n({locale:navigator.language,fallbackLocale:\"en\",messages:mes" + "sages});new Vue({el:\"#app\",i18n:t,data:{loading:!0,saving:!1,loadingIndicator:\"|\",activeTab:\"st" + "atus\",version:{systemID:\"loading...\",version:\"loading...\"},wifiStatus:{ap:{enabled:!1,ip:\"0.0." + "0.0\"},station:{enabled:!1,status:0,ip:\"0.0.0.0\"}},connection:{hostname:null,accesspoint:!0,statio" + "n:!1,ssid:null,password:null,dhcp:!0,ip:null,subnetmask:null,gateway:null},steps:[{value:50},{value:" + "0},{value:0},{value:0},{value:0},{value:70},{value:0},{value:0},{value:0},{value:0},{value:25},{valu" + "e:0},{value:0},{value:0}]},created:function(){var e=this;document.title=t.t(\"title\"),e.startLoadin" + "gIndicator(),e.updateWiFiStatus(),setInterval(e.updateWiFiStatus,5e3),axios.get(\"/api/version\").th" + "en(function(t){\"object\"==typeof t.data&&(e.version=t.data)}).catch(function(t){console.log(t)}),ax" + "ios.all([axios.get(\"/api/connection\").then(function(t){\"object\"==typeof t.data&&(e.connection=t." + "data)}).catch(function(t){console.log(t)})]).then(axios.spread(function(t,n){e.stopLoadingIndicator(" + "),e.loading=!1}))},methods:{applyConnection:function(){var t=this;t.saving||(t.saving=!0,axios.post(" + "\"/api/connection\",{hostname:t.connection.hostname,accesspoint:t.connection.accesspoint,station:t.c" + "onnection.station,ssid:t.connection.ssid,password:t.connection.password,dhcp:t.connection.dhcp,ip:t." + "connection.ip,subnetmask:t.connection.subnetmask,gateway:t.connection.gateway}).then(function(t){})." + "catch(function(t){console.log(t)}).then(function(){t.saving=!1}))},startLoadingIndicator:function(){" + "var t=this;t.loadingStage=0,t.loadingTimer=setInterval(function(){switch(t.loadingStage++,console.lo" + "g(t.loadingStage),t.loadingStage){case 1:t.loadingIndicator=\"/\";break;case 2:t.loadingIndicator=\"" + "-\";break;case 3:t.loadingIndicator=\"\\\\\";break;case 4:t.loadingIndicator=\"|\",t.loadingStage=0}" + "},250)},stopLoadingIndicator:function(){clearInterval(this.loadingTimer)},getWiFiStationStatus:funct" + "ion(){if(!this.wifiStatus.station.enabled)return\"disconnected\";switch(this.wifiStatus.station.stat" + "us){case 0:case 2:return\"connecting\";case 1:case 4:case 5:return\"error\";case 3:return\"connected" + "\";case 6:default:return\"disconnected\"}},getWiFiStationStatusText:function(){if(!this.wifiStatus.s" + "tation.enabled)return t.t(\"wifiStatus.stationmode.disabled\");switch(this.wifiStatus.station.status" + "){case 0:return t.t(\"wifiStatus.stationmode.idle\");case 1:return t.t(\"wifiStatus.stationmode.noSS" + "ID\");case 2:return t.t(\"wifiStatus.stationmode.scanCompleted\");case 3:return this.wifiStatus.stat" + "ion.ip;case 4:return t.t(\"wifiStatus.stationmode.connectFailed\");case 5:return t.t(\"wifiStatus.st" + "ationmode.connectionLost\");case 6:default:return t.t(\"wifiStatus.stationmode.disconnected\")}},upd" + "ateWiFiStatus:function(){var t=this;t.saving||axios.get(\"/api/connection/status\").then(function(e)" + "{\"object\"==typeof e.data&&(t.wifiStatus=e.data)}).catch(function(t){console.log(t)})}}})}"; + +#endif diff --git a/src/assets/version.h b/src/assets/version.h new file mode 100644 index 0000000..76ae8d0 --- /dev/null +++ b/src/assets/version.h @@ -0,0 +1,14 @@ +#ifndef __assets_version +#define __assets_version + +const uint8_t VersionMajor = 2; +const uint8_t VersionMinor = 0; +const uint8_t VersionPatch = 0; +const uint8_t VersionMetadata = 0; +const char VersionBranch[] = "release/2.0"; +const char VersionSha[] = "3099dd8a0e2e5fa771e6a864a1daa83de5998df0"; +const char VersionSemVer[] = "2.0.0-beta.1"; +const char VersionFullSemVer[] = "2.0.0-beta.1+0"; +const char VersionCommitDate[] = "2017-10-05"; + +#endif diff --git a/src/charproperties.cpp b/src/charproperties.cpp new file mode 100644 index 0000000..9c651e6 --- /dev/null +++ b/src/charproperties.cpp @@ -0,0 +1,26 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#include "charproperties.h" +#include +#include +#include "debug.h" + +void CharProperties::assignChar(char** field, const char* newValue) +{ + if (*field != NULL) + delete *field; + + if (newValue != NULL) + { + // Include the terminating null character + size_t length = strlen(newValue) + 1; + *field = new char[length]; + strncpy(*field, newValue, length); + } + else + *field = NULL; +} \ No newline at end of file diff --git a/src/charproperties.h b/src/charproperties.h new file mode 100644 index 0000000..3ef9df4 --- /dev/null +++ b/src/charproperties.h @@ -0,0 +1,18 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#ifndef __charproperties +#define __charproperties + +#include + +class CharProperties +{ + protected: + void assignChar(char** field, const char* newValue); +}; + +#endif \ No newline at end of file diff --git a/src/config.h b/src/config.h index c7ee869..c0569d5 100644 --- a/src/config.h +++ b/src/config.h @@ -1,26 +1,20 @@ -#ifndef __Config -#define __Config +#ifndef __config +#define __config -#include #include -#include "credentials.h" + +#define SerialDebug +static const uint32_t SerialDebugBaudrate = 115200; +static const uint32_t SerialDebugStartupDelay = 2000; -//#define SerialDebug - - -// The name of this device on the network -static const char* WiFiHostname = "Stairs"; - - -// The number of steps (assumed to be <= 16, as the code currently only controls 1 PCA9685 board) -static const uint8_t StepCount = 14; - - -// The port number on which the UDP server listens -static const uint16_t UDPPort = 3126; +static const char* ConnectionSettingsFile = "/settings.json"; +static const char* DefaultAPSSIDPrefix = "Stairs-"; + +static const uint32_t StationModeTimeout = 30000; +/* // Pins for the I2C bus static const uint8_t PinSDA = 13; static const uint8_t PinSCL = 12; @@ -29,28 +23,6 @@ static const uint8_t PinSCL = 12; // I2C address and PWM frequency of the PCA9685 board static const uint8_t PWMDriverAddress = 0x40; static const uint16_t PWMDriverPWMFrequency = 1600; - - -// Determines if OTA firmware updates are enabled -// 0 - Disabled -// 1 - Enabled (fixed URL) -// 2 - Enabled (use URL in command) -static const uint8_t OTAUpdateEnabled = 2; - -static const char* OTAUpdateFixedHost = ""; -static const uint16_t OTAUpdateFixedPort = 80; -static const char* OTAUpdateFixedPath = "/"; - -// The minimum amount of time (in milliseconds) between update requests -static const uint32_t OTAUpdateThrottle = 5000; - - -#ifdef SerialDebug -#define _d(msg) Serial.print(msg) -#define _dln(msg) Serial.println(msg) -#else -#define _d(msg) do { } while (0) -#define _dln(msg) do { } while (0) -#endif +*/ #endif \ No newline at end of file diff --git a/src/credentials.example.h b/src/credentials.example.h deleted file mode 100644 index b77597e..0000000 --- a/src/credentials.example.h +++ /dev/null @@ -1,3 +0,0 @@ -// Create a copy of this file called "credentials.h" -static const char* WiFiSSID = "example"; -static const char* WiFiPassword = "example"; \ No newline at end of file diff --git a/src/debug.cpp b/src/debug.cpp new file mode 100644 index 0000000..a43be50 --- /dev/null +++ b/src/debug.cpp @@ -0,0 +1,17 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#include "debug.h" + + +void _dinit() +{ + #ifdef SerialDebug + Serial.begin(SerialDebugBaudrate); + Serial.setDebugOutput(true); + delay(SerialDebugStartupDelay); + #endif +} \ No newline at end of file diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..f722331 --- /dev/null +++ b/src/debug.h @@ -0,0 +1,24 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#ifndef __serialdebug +#define __serialdebug + +#include "config.h" +#include + +void _dinit(); + +#ifdef SerialDebug + #define _d(msg) Serial.print(msg) + #define _dln(msg) Serial.println(msg) +#else + #define _d(msg) do { } while (0) + #define _dln(msg) do { } while (0) +#endif + + +#endif \ No newline at end of file diff --git a/src/global.cpp b/src/global.cpp new file mode 100644 index 0000000..ed8fd77 --- /dev/null +++ b/src/global.cpp @@ -0,0 +1,15 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#include "global.h" + +ConnectionSettings* connectionSettings = new ConnectionSettings(); +bool connectionSettingsChanged = false; + +uint32_t currentTime; + + +IPAddress emptyIP(0, 0, 0, 0); diff --git a/src/global.h b/src/global.h new file mode 100644 index 0000000..1931b61 --- /dev/null +++ b/src/global.h @@ -0,0 +1,21 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#ifndef __global +#define __global + +#include +#include +#include +#include "settings/connection.h" + +extern ConnectionSettings* connectionSettings; +extern bool connectionSettingsChanged; +extern uint32_t currentTime; + +extern IPAddress emptyIP; + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e5b5fd1..24198fb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,28 +1,225 @@ /* * Stairs lighting * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs */ -#include -#include +#include #include -#include -#include +#include +#include + +extern "C" { + #include +} #include "config.h" -#include "protocol.h" -#include "components\PCA9685.h" -//#include "modes\adc.h" -#include "modes\alternate.h" -#include "modes\custom.h" -#include "modes\slide.h" -#include "modes\static.h" -#include "stairs.h" -#include "version.h" +#include "debug.h" +#include "settings/connection.h" +#include "global.h" +#include "server/static.h" +#include "server/api.h" -PCA9685* pwmDriver; -Stairs* stairs; -WiFiUDP udpServer; +ADC_MODE(ADC_VCC); + +// Forward declarations +void initWiFi(); +#ifdef SerialDebug +void wifiEvent(WiFiEvent_t event); +#endif +void updateLED(); + +void startServer(); +void stopServer(); +void handleNotFound(AsyncWebServerRequest* request); + + +AsyncWebServer server(80); +bool accessPoint = false; +bool stationMode = false; +bool forceAccessPoint = false; + +uint32_t stationModeStart = 0; + + +void setup() +{ + _dinit(); + currentTime = millis(); + + if (!SPIFFS.begin()) + _dln("Setup :: failed to mount file system"); + + connectionSettings->read(); + + _dln("Setup :: initializing WiFi"); + WiFi.persistent(false); + WiFi.mode(WIFI_OFF); + + #ifdef SerialDebug + // onEvent is already deprecated, but since I'm only using it + // for debug purposes we'll see how long it lasts... + WiFi.onEvent(wifiEvent); + _d("WiFi :: MAC address: "); + _dln(WiFi.macAddress()); + #endif + + initWiFi(); + + _dln("Setup :: registering routes"); + registerStaticRoutes(&server); + registerAPIRoutes(&server); + + _dln("Setup :: starting HTTP server"); + server.onNotFound(handleNotFound); + server.begin(); +} + + +void loop() +{ + currentTime = millis(); + + if (connectionSettingsChanged) + { + _dln("Loop :: connection settings changed"); + initWiFi(); + connectionSettingsChanged = false; + } + + + if (stationModeStart > 0) + { + bool isConnected = WiFi.status() == WL_CONNECTED; + + if (isConnected) + { + _d("WiFi :: connected, IP address: "); + _dln(WiFi.localIP()); + + stationModeStart = 0; + } + else if (stationMode && accessPoint && + currentTime - stationModeStart >= StationModeTimeout) + { + _dln("WiFi :: unable to connect, switching off station mode, status:"); + _dln(WiFi.status()); + + #ifdef SerialDebug + WiFi.printDiag(Serial); + #endif + + // Connecting to access point is taking too long and is blocking + // the access point mode, stop trying + stationMode = false; + WiFi.disconnect(); + WiFi.mode(WIFI_AP); + } + } + + updateLED(); +} + + +void initWiFi() +{ + WiFi.disconnect(); + WiFi.softAPdisconnect(); + + accessPoint = connectionSettings->flag(AccessPoint) || forceAccessPoint; + stationMode = connectionSettings->flag(StationMode) && connectionSettings->ssid() != NULL; + + WiFi.mode(accessPoint && stationMode ? WIFI_AP_STA : + accessPoint ? WIFI_AP : + stationMode ? WIFI_STA : + WIFI_OFF); + + if (accessPoint) + { + _dln("WiFi :: starting access point"); + String ssidString = DefaultAPSSIDPrefix + String(ESP.getChipId(), HEX); + if (WiFi.softAP((const char *)ssidString.c_str())) + { + _d("WiFi :: IP address: "); + _dln(WiFi.softAPIP()); + } + else + _d("WiFi :: failed to start soft access point"); + } + + if (stationMode) + { + _d("WiFi :: starting station mode to: "); + _dln(connectionSettings->ssid()); + + stationModeStart = currentTime; + + if (WiFi.begin(connectionSettings->ssid(), connectionSettings->password())) + { + if (connectionSettings->flag(DHCP)) + // I've had the same issue as described here with config(0, 0, 0): + // https://stackoverflow.com/questions/40069654/how-to-clear-static-ip-configuration-and-start-dhcp + wifi_station_dhcpc_start(); + else + WiFi.config(connectionSettings->ip(), connectionSettings->gateway(), connectionSettings->subnetMask()); + } + else + _d("WiFi :: failed to start station mode"); + } +} + + +#ifdef SerialDebug +void wifiEvent(WiFiEvent_t event) +{ + switch (event) + { + case WIFI_EVENT_STAMODE_CONNECTED: + _dln("WiFi:: station mode: connected"); break; + + case WIFI_EVENT_STAMODE_DISCONNECTED: + _dln("WiFi:: station mode: disconnected"); break; + + case WIFI_EVENT_STAMODE_AUTHMODE_CHANGE: + _dln("WiFi:: station mode: authmode change"); break; + + case WIFI_EVENT_STAMODE_GOT_IP: + _dln("WiFi:: station mode: got IP"); + _dln(WiFi.localIP()); + break; + + case WIFI_EVENT_STAMODE_DHCP_TIMEOUT: + _dln("WiFi:: station mode: DHCP timeout"); break; + + case WIFI_EVENT_SOFTAPMODE_STACONNECTED: + _dln("WiFi:: soft AP mode: station connected"); break; + + case WIFI_EVENT_SOFTAPMODE_STADISCONNECTED: + _dln("WiFi:: soft AP mode: station disconnected"); break; + } +} +#endif + + +void updateLED() +{ + //while (WiFi.status() != WL_CONNECTED) + //{ + + //} +} + + +void handleNotFound(AsyncWebServerRequest *request) +{ + _d("HTTP :: not found: "); _dln(request->url()); + request->send(404); +} + + + +/* uint8_t currentModeIdentifier; IMode* currentMode; @@ -362,4 +559,5 @@ void setCurrentMode(IMode* mode, uint8_t identifier) void handleCurrentMode() { currentMode->tick(stairs, currentTime); -} \ No newline at end of file +} +*/ \ No newline at end of file diff --git a/src/modes/alternate.cpp b/src/modes/alternate.cpp deleted file mode 100644 index 29e119a..0000000 --- a/src/modes/alternate.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "alternate.h" -#include - - -void AlternateMode::init(IStairs* stairs, uint32_t currentTime) -{ - stairs->setAll(0); - - this->lastChange = currentTime; - this->even = false; -} - - -void AlternateMode::tick(IStairs* stairs, uint32_t currentTime) -{ - if (currentTime - this->lastChange < this->parameters.interval) - return; - - this->lastChange = currentTime; - this->even = !this->even; - - uint8_t stepCount = stairs->getCount(); - for (uint8_t step = 0; step < stepCount; step++) - { - stairs->set(step, ((step % 2) == 0) == this->even ? this->parameters.brightness : 0); - } -} \ No newline at end of file diff --git a/src/modes/alternate.h b/src/modes/alternate.h deleted file mode 100644 index 70c2c1f..0000000 --- a/src/modes/alternate.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef __AlternateMode -#define __AlternateMode - -#include -#include "base.h" -#include "../config.h" - - -struct AlternateModeParameters -{ - uint16_t interval; - uint16_t brightness; -}; - - -class AlternateMode : public BaseMode -{ - private: - uint32_t lastChange; - bool even = false; - - public: - AlternateMode() - { - parameters.interval = 500; - parameters.brightness = IStairs::On; - } - - void init(IStairs* stairs, uint32_t currentTime); - void tick(IStairs* stairs, uint32_t currentTime); -}; - -#endif \ No newline at end of file diff --git a/src/modes/base.h b/src/modes/base.h deleted file mode 100644 index 255756e..0000000 --- a/src/modes/base.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __BaseMode -#define __BaseMode - -#include -#include -#include "../config.h" -#include "../mode.h" - - -template -class BaseMode : public IMode -{ - protected: - T parameters; - - public: - virtual void read(uint8_t* data) - { - _d("Reading parameters, size "); - _dln(sizeof(T)); - memcpy(&this->parameters, data, sizeof(T)); - } - - virtual void write(Stream* stream) - { - _d("Writing parameters, size "); - _dln(sizeof(T)); - stream->write((uint8_t*)&this->parameters, sizeof(T)); - } -}; - -#endif \ No newline at end of file diff --git a/src/modes/custom.cpp b/src/modes/custom.cpp deleted file mode 100644 index 49119e2..0000000 --- a/src/modes/custom.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "custom.h" -#include - - -void CustomMode::read(uint8_t* data) -{ - // The packet is zeroed before we get our hands on it and - // the size should also be larger as noted in main.cpp, - // so a straight-up copy should be safe. - memcpy(this->values, data, sizeof(this->values)); -} - - -void CustomMode::write(Stream* stream) -{ - stream->write((uint8_t*)&this->values, sizeof(this->values)); -} - - -void CustomMode::init(IStairs* stairs, uint32_t currentTime) -{ - for (uint8_t step = 0; step < StepCount; step++) - stairs->set(step, this->values[step]); -} - - -void CustomMode::tick(IStairs* stairs, uint32_t currentTime) -{ -} diff --git a/src/modes/custom.h b/src/modes/custom.h deleted file mode 100644 index dd3a23e..0000000 --- a/src/modes/custom.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __CustomMode -#define __CustomMode - -#include -#include "base.h" -#include "../config.h" - -class CustomMode : public IMode -{ - private: - uint16_t values[StepCount]; - - public: - void read(uint8_t* data); - void write(Stream* stream); - - void init(IStairs* stairs, uint32_t currentTime); - void tick(IStairs* stairs, uint32_t currentTime); -}; - -#endif \ No newline at end of file diff --git a/src/modes/slide.h b/src/modes/slide.h deleted file mode 100644 index 26885ad..0000000 --- a/src/modes/slide.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __SlideMode -#define __SlideMode - -#include -#include "base.h" -#include "../config.h" - -class SlideMode : public IMode -{ - private: - uint16_t interval; - bool up; -}; - -#endif \ No newline at end of file diff --git a/src/modes/static.cpp b/src/modes/static.cpp deleted file mode 100644 index 7398bf2..0000000 --- a/src/modes/static.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "static.h" - -void StaticMode::init(IStairs* stairs, uint32_t currentTime) -{ - _dln("Initializing static mode:"); - _d("currentBrightness: "); _dln(this->currentBrightness); - _d("brightness: "); _dln(this->parameters.brightness); - _d("easeTime: "); _dln(this->parameters.easeTime); - - if (this->parameters.easeTime > 0 && this->parameters.brightness != this->currentBrightness) - { - _dln("Easing..."); - - this->easeStartTime = currentTime; - this->easeStartBrightness = currentBrightness; - - if (this->parameters.brightness > this->currentBrightness) - this->easeState = Up; - else - this->easeState = Down; - } - else - { - _dln("Updating immediately..."); - this->easeState = None; - - stairs->setAll(this->parameters.brightness); - this->currentBrightness = this->parameters.brightness; - } -} - - -void StaticMode::tick(IStairs* stairs, uint32_t currentTime) -{ - if (this->easeState == None) - return; - - uint32_t elapsedTime = currentTime - this->easeStartTime; - uint32_t diff = this->easeState == Up ? this->parameters.brightness - this->easeStartBrightness : this->easeStartBrightness - this->parameters.brightness; - uint32_t delta = (diff * elapsedTime) / this->parameters.easeTime; - - this->currentBrightness = this->easeState == Up ? this->easeStartBrightness + delta : this->easeStartBrightness - delta; - - - if (elapsedTime >= this->parameters.easeTime) - { - this->currentBrightness = this->parameters.brightness; - this->easeState = None; - } - - stairs->setAll(this->currentBrightness); -} \ No newline at end of file diff --git a/src/modes/static.h b/src/modes/static.h deleted file mode 100644 index 5ee9472..0000000 --- a/src/modes/static.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef __StaticMode -#define __StaticMode - -#include -#include "base.h" -#include "../config.h" - - -struct StaticModeParameters -{ - uint16_t brightness; - uint16_t easeTime; -}; - -enum EaseState -{ - None, - Up, - Down -}; - - -class StaticMode : public BaseMode -{ - private: - uint16_t currentBrightness; - uint32_t easeStartTime; - uint16_t easeStartBrightness; - EaseState easeState; - - public: - StaticMode() - { - parameters.brightness = 0; - parameters.easeTime = 0; - - easeState = None; - currentBrightness = 0; - } - - void init(IStairs* stairs, uint32_t currentTime); - void tick(IStairs* stairs, uint32_t currentTime); -}; - -#endif \ No newline at end of file diff --git a/src/server/api.cpp b/src/server/api.cpp new file mode 100644 index 0000000..a8e743b --- /dev/null +++ b/src/server/api.cpp @@ -0,0 +1,101 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#include "api.h" +#include +#include +#include +#include "../assets/version.h" +#include "../debug.h" +#include "../global.h" +#include "../settings/connection.h" + + +void handleVersion(AsyncWebServerRequest *request) +{ + _dln("API :: version"); + + DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(2)); + + JsonObject& root = jsonBuffer.createObject(); + root["systemID"] = String(ESP.getChipId(), HEX); + root["version"] = String(VersionFullSemVer) + " sha." + String(VersionSha); + + AsyncResponseStream *response = request->beginResponseStream("application/json"); + root.printTo(*response); + + request->send(response); +} + + +void handleConnectionStatus(AsyncWebServerRequest *request) +{ + _dln("API :: connection status"); + + WiFiMode_t mode = WiFi.getMode(); + + + DynamicJsonBuffer jsonBuffer((2 * JSON_OBJECT_SIZE(2)) + JSON_OBJECT_SIZE(3)); + + JsonObject& root = jsonBuffer.createObject(); + JsonObject& ap = root.createNestedObject("ap"); + ap["enabled"] = (mode == WIFI_AP || mode == WIFI_AP_STA); + ap["ip"] = WiFi.softAPIP().toString(); + + JsonObject& station = root.createNestedObject("station"); + station["enabled"] = (mode == WIFI_STA || mode == WIFI_AP_STA); + station["status"] = (uint8_t)WiFi.status(); + station["ip"] = WiFi.localIP().toString(); + + AsyncResponseStream *response = request->beginResponseStream("application/json"); + root.printTo(*response); + + request->send(response); +} + + +void handleGetConnection(AsyncWebServerRequest *request) +{ + _dln("API :: get connection"); + + AsyncResponseStream *response = request->beginResponseStream("application/json"); + connectionSettings->toJson(*response); + request->send(response); +} + + +void handlePostConnection(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) +{ + _dln("API :: post connection"); + + bool changed; + if (connectionSettings->fromJson((char*)data, &changed)) + { + connectionSettings->write(); + + if (changed) + connectionSettingsChanged = true; + + request->send(200); + } + else + request->send(400); +} + + +void devNullRequest(AsyncWebServerRequest *request) { } +void devNullFileUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) { } + + +void registerAPIRoutes(AsyncWebServer* server) +{ + server->on("/api/version", HTTP_GET, handleVersion); + + server->on("/api/connection/status", HTTP_GET, handleConnectionStatus); + + server->on("/api/connection", HTTP_GET, handleGetConnection); + server->on("/api/connection", HTTP_POST, devNullRequest, devNullFileUpload, handlePostConnection); +} \ No newline at end of file diff --git a/src/server/api.h b/src/server/api.h new file mode 100644 index 0000000..4de41f8 --- /dev/null +++ b/src/server/api.h @@ -0,0 +1,13 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#ifndef __server_api +#define __server_api +#include + +void registerAPIRoutes(AsyncWebServer* server); + +#endif \ No newline at end of file diff --git a/src/server/static.cpp b/src/server/static.cpp new file mode 100644 index 0000000..8864355 --- /dev/null +++ b/src/server/static.cpp @@ -0,0 +1,35 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#include "static.h" +#include "../debug.h" +#include "../assets/html.h" +#include "../assets/js.h" +#include "../assets/css.h" +#include "../assets/images.h" + + +void handleStatic(AsyncWebServerRequest *request, const String& contentType, PGM_P content) +{ + _d("HTTP :: static: "); _dln(request->url()); + request->send_P(200, contentType, content); +} + + +void registerStaticRoutes(AsyncWebServer* server) +{ + server->on("/", HTTP_GET, [](AsyncWebServerRequest *request) { handleStatic(request, "text/html", EmbeddedIndex); }); + + server->on("/bundle.js", HTTP_GET, [](AsyncWebServerRequest *request) { handleStatic(request, "text/javascript", EmbeddedBundleJS); }); + server->on("/bundle.css", HTTP_GET, [](AsyncWebServerRequest *request) { handleStatic(request, "text/css", EmbeddedBundleCSS); }); + + server->on("/logo.png", HTTP_GET, [](AsyncWebServerRequest *request) + { + _d("HTTP :: static: "); _dln(request->url()); + AsyncWebServerResponse *response = request->beginResponse_P(200, "image/png", EmbeddedLogo, sizeof(EmbeddedLogo)); + request->send(response); + }); +} \ No newline at end of file diff --git a/src/server/static.h b/src/server/static.h new file mode 100644 index 0000000..285ea37 --- /dev/null +++ b/src/server/static.h @@ -0,0 +1,14 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#ifndef __server_static +#define __server_static + +#include + +void registerStaticRoutes(AsyncWebServer* server); + +#endif \ No newline at end of file diff --git a/src/settings/connection.cpp b/src/settings/connection.cpp new file mode 100644 index 0000000..32bdaf1 --- /dev/null +++ b/src/settings/connection.cpp @@ -0,0 +1,149 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#include "connection.h" +#include +#include +#include "../debug.h" +#include "../global.h" +#include "../config.h" + + + +void ConnectionSettings::read() +{ + _dln("ConnectionSettings :: opening file"); + File settingsFile = SPIFFS.open(ConnectionSettingsFile, "r"); + if (!settingsFile) + { + _dln("ConnectionSettings :: failed to open file"); + return; + } + + size_t size = settingsFile.size(); + if (size > 1024) + { + _dln("ConnectionSettings :: file size is too large"); + return; + } + + if (size == 0) + { + _dln("ConnectionSettings :: zero size file"); + return; + } + + std::unique_ptr buf(new char[size]); + settingsFile.readBytes(buf.get(), size); + + _dln(buf.get()); + + if (fromJson(buf.get())) + _dln("ConnectionSettings :: read from file"); + else + _dln("ConnectionSettings :: failed to parse file"); +} + + +void ConnectionSettings::write() +{ + _dln("ConnectionSettings :: opening file for writing"); + File settingsFile = SPIFFS.open(ConnectionSettingsFile, "w"); + if (!settingsFile) + { + _dln("ConnectionSettings:: failed to open file for writing"); + return; + } + + toJson(settingsFile); + _dln("ConnectionSettings:: written to file"); +} + + +void ConnectionSettings::toJson(Print &print) +{ + DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(9)); + + JsonObject& root = jsonBuffer.createObject(); + root["hostname"] = hostname(); + root["accesspoint"] = flag(AccessPoint); + root["station"] = flag(StationMode); + root["ssid"] = ssid(); + root["password"] = password(); + root["dhcp"] = flag(DHCP); + root["ip"] = ip() != 0 ? ip().toString() : ""; + root["subnetmask"] = subnetMask() != 0 ? subnetMask().toString() : ""; + root["gateway"] = gateway() != 0 ? gateway().toString() : ""; + + root.printTo(print); +} + + +bool ConnectionSettings::fromJson(char* data) +{ + return fromJson(data, NULL); +} + + +bool ConnectionSettings::fromJson(char* data, bool* changed) +{ + if (changed != NULL) + *changed = false; + + DynamicJsonBuffer jsonBuffer(JSON_OBJECT_SIZE(9) + 250); + JsonObject& root = jsonBuffer.parseObject(data); + + if (!root.success()) + return false; + + IPAddress jsonIP; + IPAddress jsonSubnetMask; + IPAddress jsonGateway; + + const char* jsonHostname = root["hostname"]; + bool jsonAccessPoint = root["accesspoint"]; + bool jsonStation = root["station"]; + const char* jsonSSID = root["ssid"]; + const char* jsonPassword = root["password"]; + bool jsonDHCP = root["dhcp"]; + const char* jsonIPText = root["ip"]; + const char* jsonSubnetMaskText = root["subnetmask"]; + const char* jsonGatewayText = root["gateway"]; + + if (jsonIPText == NULL || !jsonIP.fromString(jsonIPText)) jsonIP = emptyIP; + if (jsonSubnetMaskText == NULL || !jsonSubnetMask.fromString(jsonSubnetMaskText)) jsonSubnetMask = emptyIP; + if (jsonGatewayText == NULL || !jsonGateway.fromString(jsonGatewayText)) jsonGateway = emptyIP; + + + if (!(jsonAccessPoint || jsonStation)) + jsonAccessPoint = true; + + if ((jsonHostname != hostname()) || + (jsonAccessPoint != flag(AccessPoint)) || + (jsonStation != flag(StationMode)) || + (jsonSSID != ssid()) || + (jsonPassword != password()) || + (jsonDHCP != flag(DHCP)) || + (jsonIP != ip()) || + (jsonSubnetMask != subnetMask()) || + (jsonGateway != gateway())) + { + hostname(jsonHostname); + flag(AccessPoint, jsonAccessPoint); + flag(StationMode, jsonStation); + ssid(jsonSSID); + password(jsonPassword); + flag(DHCP, jsonDHCP); + ip(jsonIP); + subnetMask(jsonSubnetMask); + gateway(jsonGateway); + + if (changed != NULL) + *changed = true; + } + + return true; +} \ No newline at end of file diff --git a/src/settings/connection.h b/src/settings/connection.h new file mode 100644 index 0000000..a7dd4d8 --- /dev/null +++ b/src/settings/connection.h @@ -0,0 +1,73 @@ +/* + * Stairs + * Copyright 2017 (c) Mark van Renswoude + * + * https://git.x2software.net/pub/Stairs +*/ +#ifndef __settingsconnection +#define __settingsconnection + +#include +#include +#include +#include "../charproperties.h" + + +enum ConnectionSettingsFlags +{ + AccessPoint = 1, + StationMode = 2, + DHCP = 4 +}; + + +class ConnectionSettings : CharProperties +{ + private: + char* mHostname = NULL; + uint8_t mFlags = AccessPoint | DHCP; + char* mSSID = NULL; + char* mPassword = NULL; + IPAddress mIP = (uint32_t)0; + IPAddress mSubnetMask = (uint32_t)0; + IPAddress mGateway = (uint32_t)0; + + public: + void read(); + void write(); + + + void toJson(Print &print); + bool fromJson(char* data); + bool fromJson(char* data, bool* changed); + + + char* hostname() { return mHostname; } + void hostname(const char* value) { assignChar(&mHostname, value); } + + bool flag(ConnectionSettingsFlags flag) { return (mFlags & flag) != 0; } + void flag(ConnectionSettingsFlags flag, bool enabled) + { + if (enabled) + mFlags |= flag; + else + mFlags &= ~flag; + } + + char* ssid() { return mSSID; } + void ssid(const char* value) { assignChar(&mSSID, value); } + + char* password() { return mPassword; } + void password(const char* value) { assignChar(&mPassword, value); } + + IPAddress ip() { return mIP; } + void ip(IPAddress value) { mIP = value; } + + IPAddress subnetMask() { return mSubnetMask; } + void subnetMask(IPAddress value) { mSubnetMask = value; } + + IPAddress gateway() { return mGateway; } + void gateway(IPAddress value) { mGateway = value; } +}; + +#endif \ No newline at end of file diff --git a/src/stairs.cpp b/src/stairs.cpp index 0653b36..559a7ad 100644 --- a/src/stairs.cpp +++ b/src/stairs.cpp @@ -1,6 +1,7 @@ +#include "stairs.h" #include #include -#include "stairs.h" +#include "debug.h" @@ -19,11 +20,13 @@ void Stairs::init(PCA9685* pwmDriver) { this->useScaling = false; +/* for (uint8_t i = 0; i < StepCount; i++) { this->ranges[i].start = IStairs::Off; this->ranges[i].end = IStairs::On; } + */ this->pwmDriver = pwmDriver; @@ -35,7 +38,7 @@ void Stairs::init(PCA9685* pwmDriver) uint8_t Stairs::getCount() { - return StepCount; + return 0;//StepCount; } @@ -49,8 +52,10 @@ void Stairs::setAll(uint16_t brightness) { //pwmDriver->setAll(this->getPWMValue(brightness)); +/* for (uint8_t step = 0; step < StepCount; step++) pwmDriver->setPWM(step, this->getPWMValue(step, brightness)); + */ } @@ -63,7 +68,7 @@ uint16_t Stairs::getPWMValue(uint8_t step, uint16_t brightness) return brightness; } - if (step < 0 || step >= StepCount) + if (step < 0 || step >= getCount()) { _dln("Step out of bounds, returning input"); return brightness; @@ -141,7 +146,7 @@ void Stairs::writeRange() Header header; header.version = 1; header.useScaling = this->useScaling; - header.rangeCount = StepCount; + header.rangeCount = getCount(); f.write((uint8_t*)&header, sizeof(Header)); f.write((uint8_t*)&this->ranges, sizeof(this->ranges)); diff --git a/src/stairs.h b/src/stairs.h index e98a171..a61c6d0 100644 --- a/src/stairs.h +++ b/src/stairs.h @@ -2,8 +2,8 @@ #define __Stairs #include "components/PCA9685.h" -#include "modes/base.h" #include "config.h" +#include "mode.h" struct Range @@ -19,7 +19,7 @@ class Stairs : public IStairs PCA9685* pwmDriver; bool useScaling; - Range ranges[StepCount]; + Range ranges[16]; protected: void readRange(); diff --git a/updateversion.ps1 b/updateversion.ps1 deleted file mode 100644 index b183a54..0000000 --- a/updateversion.ps1 +++ /dev/null @@ -1,23 +0,0 @@ -$output = & GitVersion /output json /nofetch -if ($LASTEXITCODE -ne 0) { - Write-Verbose "$output" - throw "GitVersion failed with exit code: $LASTEXITCODE" -} - -$version = $output | ConvertFrom-Json - -@" -#ifndef __Version -#define __Version - -static const char* FirmwareVersion = "{0}"; - -#endif -"@ -f $version.FullSemVer | Out-File -Encoding UTF8 .\src\version.h - -@" -module.exports = -{{ - Version: "{0}" -}}; -"@ -f $version.FullSemVer | Out-File -Encoding UTF8 .\web\version.js diff --git a/upload.ps1 b/upload.ps1 deleted file mode 100644 index 32ed813..0000000 --- a/upload.ps1 +++ /dev/null @@ -1,2 +0,0 @@ -& .\updateversion.ps1 -& platformio run --target upload \ No newline at end of file diff --git a/web/.bowerrc b/web/.bowerrc deleted file mode 100644 index d058d74..0000000 --- a/web/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "static/bower_components" -} \ No newline at end of file diff --git a/web/app.js b/web/app.js index 2e52159..0f9421c 100644 --- a/web/app.js +++ b/web/app.js @@ -1,160 +1,248 @@ -var fs = require('fs'); -var md5File = require('md5-file'); -var express = require('express'); -var semverUtils = require('semver-utils') -var client = require('./client'); - -var httpPort = 3127; - -var stairsHost = '10.138.2.25'; -var stairsUdpPort = 3126; - -var firmwareFile = './update/firmware.bin'; -var alwaysUpdate = true; - - -function requireNoCache(filename) +function startApp() { - delete require.cache[require.resolve(filename)]; - return require(filename); -} - - -function isNewer(version1, version2) -{ - if (alwaysUpdate) return true; - - if (version1.major > version2.major) return true; - if (version1.major < version2.major) return false; - - if (version1.minor > version2.minor) return true; - if (version1.minor < version2.minor) return false; - - if (version1.patch > version2.patch) return true; - if (version1.patch < version2.patch) return false; - - if (parseInt(version1.build, 10) > parseInt(version2.build, 10)) return true; - return false; -} - - -client.init(stairsHost, stairsUdpPort); - - -var app = express(); - -app.get('/ping', function(req, res) -{ - client.ping(function(data, error) - { - if (error) - res.status(500); - - res.send(data); + var i18n = new VueI18n({ + locale: navigator.language, + fallbackLocale: 'en', + messages: messages }); -}); -app.get('/getMode', function(req, res) -{ - client.getMode(function(data, error) - { - if (error) - res.status(500); + var app = new Vue({ + el: '#app', - res.send(data); - }); -}); + i18n: i18n, -app.get('/setMode/:mode', function(req, res) -{ - client.setMode(req.params.mode, req.query, function(data, error) - { - if (error) - res.status(500); + data: { + loading: true, + saving: false, + loadingIndicator: '|', - res.send(data); - }); -}); + activeTab: 'status', -app.get('/getRange', function(req, res) -{ - client.getRange(function(data, error) - { - if (error) - res.status(500); + version: { + systemID: 'loading...', + version: 'loading...', + }, - res.send(data); - }); -}); + wifiStatus: { + ap: { + enabled: false, + ip: '0.0.0.0' + }, + station: { + enabled: false, + status: 0, + ip: '0.0.0.0' + } + }, -app.get('/setRange', function(req, res) -{ - client.setRange(req.query, function(data, error) - { - if (error) - res.status(500); + connection: { + hostname: null, + accesspoint: true, + station: false, + ssid: null, + password: null, + dhcp: true, + ip: null, + subnetmask: null, + gateway: null + }, - res.send(data); - }); -}); + steps: [ + { value: 50 }, + { value: 0 }, + { value: 0 }, + { value: 0 }, + { value: 0 }, + { value: 70 }, + { value: 0 }, + { value: 0 }, + { value: 0 }, + { value: 0 }, + { value: 25 }, + { value: 0 }, + { value: 0 }, + { value: 0 } + ] + }, -app.get('/updateFirmware', function(req, res) -{ - client.updateFirmware(req.query, function(data, error) - { - if (error) - res.status(500); - - res.send(data); - }); -}) - -app.get('/checkUpdate', function(req, res) -{ - if (!fs.existsSync(firmwareFile)) - { - console.log('checkUpdate: ' + firmwareFile + ' not found!'); - res.sendStatus(304); - return; - } - - var version = requireNoCache('./version.js'); - var deviceVersion = semverUtils.parse(req.headers['x-esp8266-version']); - var localVersion = semverUtils.parse(version.Version); - - console.log('checkUpdate:'); - console.log(' Device version = ' + semverUtils.stringify(deviceVersion)); - console.log(' Local version = ' + semverUtils.stringify(localVersion)); - - if (isNewer(localVersion, deviceVersion)) - { - console.log('Sending update'); - - md5File(firmwareFile, function(err, hash) + created: function() { - if (err) + var self = this; + + document.title = i18n.t('title'); + self.startLoadingIndicator(); + + self.updateWiFiStatus(); + setInterval(self.updateWiFiStatus, 5000); + + axios.get('/api/version') + .then(function(response) + { + if (typeof response.data == 'object') + self.version = response.data; + }) + .catch(function(error) + { + console.log(error); + }); + + axios.all([ + axios.get('/api/connection') + .then(function(response) + { + if (typeof response.data == 'object') + self.connection = response.data; + }) + .catch(function(error) + { + console.log(error); + })/*, + + axios.get('/api/actions') + .then(function(response) + { + if (typeof response.data == 'object') + self.actions = response.data; + }) + .catch(function(error) + { + console.log(error); + })*/ + ]) + .then(axios.spread(function(acct, perms) { + self.stopLoadingIndicator(); + self.loading = false; + })); + }, + + methods: { + applyConnection: function() { - res.sendStatus(500); - return; + var self = this; + if (self.saving) return; + + self.saving = true; + + axios.post('/api/connection', { + hostname: self.connection.hostname, + accesspoint: self.connection.accesspoint, + station: self.connection.station, + ssid: self.connection.ssid, + password: self.connection.password, + dhcp: self.connection.dhcp, + ip: self.connection.ip, + subnetmask: self.connection.subnetmask, + gateway: self.connection.gateway, + }) + .then(function(response) + { + }) + .catch(function(error) + { + console.log(error); + }) + .then(function() + { + self.saving = false; + }) + }, + + startLoadingIndicator: function() + { + var self = this; + + self.loadingStage = 0; + self.loadingTimer = setInterval(function() + { + self.loadingStage++; + console.log(self.loadingStage); + switch (self.loadingStage) + { + case 1: self.loadingIndicator = '/'; break; + case 2: self.loadingIndicator = '-'; break; + case 3: self.loadingIndicator = '\\'; break; + case 4: self.loadingIndicator = '|'; self.loadingStage = 0; break; + } + }, 250); + }, + + stopLoadingIndicator: function() + { + clearInterval(this.loadingTimer); + }, + + getWiFiStationStatus: function() + { + if (!this.wifiStatus.station.enabled) + return 'disconnected'; + + switch (this.wifiStatus.station.status) + { + case 0: // WL_IDLE_STATUS + case 2: // WL_SCAN_COMPLETED + return 'connecting'; + + case 1: // WL_NO_SSID_AVAIL + case 4: // WL_CONNECT_FAILED + case 5: // WL_CONNECTION_LOST + return 'error'; + + case 3: // WL_CONNECTED + return 'connected'; + + case 6: // WL_DISCONNECTED + default: + return 'disconnected'; + } + }, + + getWiFiStationStatusText: function() + { + if (!this.wifiStatus.station.enabled) + return i18n.t('wifiStatus.stationmode.disabled'); + + switch (this.wifiStatus.station.status) + { + case 0: // WL_IDLE_STATUS + return i18n.t('wifiStatus.stationmode.idle'); + + case 1: // WL_NO_SSID_AVAIL + return i18n.t('wifiStatus.stationmode.noSSID'); + + case 2: // WL_SCAN_COMPLETED + return i18n.t('wifiStatus.stationmode.scanCompleted'); + + case 3: // WL_CONNECTED + return this.wifiStatus.station.ip; + + case 4: // WL_CONNECT_FAILED + return i18n.t('wifiStatus.stationmode.connectFailed'); + + case 5: // WL_CONNECTION_LOST + return i18n.t('wifiStatus.stationmode.connectionLost'); + + case 6: // WL_DISCONNECTED + default: + return i18n.t('wifiStatus.stationmode.disconnected'); + } + }, + + updateWiFiStatus: function() + { + var self = this; + if (self.saving) return; + + axios.get('/api/connection/status') + .then(function(response) + { + if (typeof response.data == 'object') + self.wifiStatus = response.data; + }) + .catch(function(error) + { + console.log(error); + }); } - - res.set('Content-Length', fs.statSync(firmwareFile).size); - res.set('x-MD5', hash); - res.download(firmwareFile); - }); - } - else - { - console.log('No update required'); - res.sendStatus(304); - } -}); - -app.use(express.static(__dirname + '/static')); - - - -app.listen(httpPort, function () -{ - console.log('Stairs ReST service running on port ' + httpPort); -}); \ No newline at end of file + } + }); +} \ No newline at end of file diff --git a/web/bower.json b/web/bower.json deleted file mode 100644 index f60658d..0000000 --- a/web/bower.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "stairs", - "description": "Stairs lighting project", - "main": "index.html", - "authors": [ - "Mark van Renswoude" - ], - "license": "ISC", - "homepage": "", - "private": true, - "ignore": [ - "**/.*", - "node_modules", - "src/bower_components" - ], - "dependencies": { - "knockout": "^3.4.2", - "jquery": "^3.2.1", - "crossroads": "^0.12.2", - "hasher": "^1.2.0", - "requirejs": "^2.3.3", - "text": "requirejs/text#^2.0.15", - "bootstrap": "v4.0.0-alpha.6", - "nprogress": "^0.2.0" - } -} diff --git a/web/client.js b/web/client.js deleted file mode 100644 index 5762db1..0000000 --- a/web/client.js +++ /dev/null @@ -1,342 +0,0 @@ -var dgram = require('dgram'); -var protocol = require('./protocol'); -var BufferReader = require('buffer-reader'); - - -var responseHandlers = {}; - -function registerResponseHandler(command, callback) -{ - if (!responseHandlers.hasOwnProperty(command)) - responseHandlers[command] = [callback]; - else - responseHandlers[command].push(callback); -} - - -function callResponseHandlers(command, reader, error) -{ - if (!responseHandlers.hasOwnProperty(command)) - return; - - newHandlers = []; - responseHandlers[command].forEach(function(callback) - { - if (!callback(reader, error)) - newHandlers.push(callback); - }); - - responseHandlers[command] = newHandlers; -} - - -var serverHost = ''; -var serverPort = 0; - -var client = dgram.createSocket('udp4'); -client.on('message', function (message, remote) -{ - console.log(message.toString('hex')); - if (message.length < 2) - return; - - var reader = new BufferReader(message); - - if (reader.nextInt8() !== protocol.Command.Reply) - return; - - var command = reader.nextInt8(); - if (command === protocol.Command.Error) - callResponseHandlers(reader.nextInt8(), reader, true) - else - callResponseHandlers(command, reader, false); -}); - - -function requestResponse(buffer, callback, withTimeout) -{ - if (buffer === null || buffer.length == 0) return; - console.log('> ' + buffer.toString('hex')); - - var command = buffer.readInt8(0); - var cancelled = false; - - if (typeof(withTimeout) == 'undefined') withTimeout = true; - if (withTimeout) - { - var timeout = setTimeout(function() - { - cancelled = true; - callback(null, true); - clearTimeout(timeout); - }, 2000); - } - - registerResponseHandler(command, function(reader, error) - { - if (cancelled) return; - if (withTimeout) clearTimeout(timeout); - - callback(reader, error); - return true; - }); - - client.send(buffer, 0, buffer.length, serverPort, serverHost, function(err, bytes) - { - if (err) - onError(); - }); -} - - -function readModeData(mode, reader) -{ - switch (mode) - { - case protocol.Mode.Static: - return { - brightness: reader.nextInt16LE(), - easeTime: reader.nextInt16LE() - }; - - case protocol.Mode.Custom: - var values = []; - while (reader.tell() < reader.buf.length) - values.push(reader.nextInt16LE()); - - return { - brightness: values - }; - - case protocol.Mode.Alternate: - return { - interval: reader.nextInt16LE(), - brightness: reader.nextInt16LE() - }; - - case protocol.Mode.Slide: - return { - interval: reader.nextInt16LE(), - brightness: reader.nextInt16LE(), - direction: reader.nextInt8(), - fadeOutTime: reader.nextInt16LE() - }; - } - - return null; -} - - -function readRangeData(reader) -{ - var data = { useScaling: reader.nextInt8() == 1, values: [] }; - - while (reader.tell() < reader.buf.length) - data.values.push({ start: reader.nextInt16LE(), end: reader.nextInt16LE() }); - - return data; -} - - -function lsb(value) { return value & 0xFF; } -function msb(value) { return (value >> 8) & 0xFF; } - - -function getBrightness(value) -{ - if (typeof(value) == 'string' && value.substr(-1) === '%') - return (Number(value.substr(0, value.length - 1)) * 4096 / 100); - - return Number(value) || 0; -} - - -function writeModeData(mode, data) -{ - switch (mode) - { - case protocol.Mode.Static: - var brightness = getBrightness(data.brightness); - - return new Buffer([protocol.Command.SetMode, mode, lsb(brightness), msb(brightness), lsb(500), msb(500)]); - - case protocol.Mode.Custom: - var brightness = typeof(data.brightness) !== 'undefined' ? data.brightness.split(',') : []; - - var valueCount = Math.min(16, brightness.length); - var buffer = Buffer.alloc(2 + (valueCount * 2)); - buffer.writeUInt8(protocol.Command.SetMode, 0); - buffer.writeUInt8(mode, 1); - - for (var index = 0; index < valueCount; index++) - buffer.writeUInt16LE(getBrightness(brightness[index]), 2 + (index * 2)); - - return buffer; - - case protocol.Mode.Alternate: - var brightness = getBrightness(data.brightness); - if (typeof(data.interval) == 'undefined') data.interval = 500; - - return new Buffer([protocol.Command.SetMode, mode, - lsb(data.interval), msb(data.interval), - lsb(brightness), msb(brightness)]); - - case protocol.Mode.Slide: - var brightness = getBrightness(data.brightness); - if (typeof(data.interval) == 'undefined') data.interval = 500; - if (typeof(data.direction) == 'undefined') data.direction = 0; - if (typeof(data.fadeOutTime) == 'undefined') data.fadeOutTime = 0; - - return new Buffer([protocol.Command.SetMode, mode, - lsb(data.interval), msb(data.interval), - lsb(brightness), msb(brightness), - data.direction, - lsb(data.fadeOutTime), msb(data.fadeOutTime)]); - } -} - - -function writeRangeData(data) -{ - var start = typeof(data.start) !== 'undefined' ? data.start.split(',') : []; - var end = typeof(data.end) !== 'undefined' ? data.end.split(',') : []; - - var valueCount = Math.min(16, start.length, end.length); - var buffer = Buffer.alloc(2 + (valueCount * 4)); - buffer.writeUInt8(protocol.Command.SetRange, 0); - buffer.writeUInt8(data.useScaling ? 1 : 0, 1); - - for (var index = 0; index < valueCount; index++) - { - buffer.writeUInt16LE(getBrightness(start[index]), 2 + (index * 4)); - buffer.writeUInt16LE(getBrightness(end[index]), 4 + (index * 4)); - } - - return buffer; -} - - -module.exports = -{ - init: function(host, port) - { - serverHost = host; - serverPort = port; - }, - - - ping: function(callback) - { - requestResponse(new Buffer([protocol.Command.Ping]), - function(reader, error) - { - if (!error) - { - callback( - { - stepCount: reader.nextInt8() - }, false); - } - else - callback(null, true); - }); - }, - - getMode: function(callback) - { - requestResponse(new Buffer([protocol.Command.GetMode]), - function(reader, error) - { - if (!error) - { - var data = { mode: reader.nextInt8() }; - data.data = readModeData(data.mode, reader); - callback(data, false); - } - else - callback(null, true); - }); - }, - - setMode: function(mode, data, callback) - { - if (!protocol.Mode.hasOwnProperty(mode)) - return; - - requestResponse(writeModeData(protocol.Mode[mode], data), - function(reader, error) - { - if (!error) - { - var data = { mode: reader.nextInt8() }; - data.data = readModeData(data.mode, reader); - callback(data, false); - } - else - callback(null, true); - }); - }, - - getRange: function(callback) - { - requestResponse(new Buffer([protocol.Command.GetRange]), - function(reader, error) - { - if (!error) - { - callback(readRangeData(reader), false); - } - else - callback(null, true); - }); - }, - - setRange: function(data, callback) - { - requestResponse(writeRangeData(data), - function(reader, error) - { - if (!error) - { - callback(readRangeData(reader), false); - } - else - callback(null, true); - }); - }, - - updateFirmware: function(data, callback) - { - if (typeof(data.host) == 'undefined') data.host = ''; - if (typeof(data.port) == 'undefined') data.port = 80; - if (typeof(data.path) == 'undefined') data.path = ''; - - var buffer = Buffer.alloc(1 + (data.host.length + 1) + 2 + (data.path.length + 1)); - buffer.writeUInt8(protocol.Command.UpdateFirmware, 0); - var position = 1; - - buffer.writeUInt16LE(data.port, position); - position += 2; - - buffer.write(data.host, position); - position += data.host.length; - buffer.writeUInt8(0, position); - position++; - - buffer.write(data.path, position); - position += data.path.length; - buffer.writeUInt8(0, position); - - requestResponse(buffer, - function(reader, error) - { - if (!error) - { - var data = { hasUpdates: reader.nextInt8() == 1 }; - callback(data, false); - } - else - callback(null, true); - }, false); - } -} \ No newline at end of file diff --git a/web/dist/bundle.css b/web/dist/bundle.css new file mode 100644 index 0000000..60286a2 --- /dev/null +++ b/web/dist/bundle.css @@ -0,0 +1 @@ +*,:after,:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#606c76;font-family:Roboto,'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.6em;font-weight:300;letter-spacing:.01em;line-height:1.6}blockquote{border-left:.3rem solid #404040;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote :last-child{margin-bottom:0}.button,button,input[type=button],input[type=reset],input[type=submit]{background-color:#06f;border:.1rem solid #06f;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type=button]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:focus,input[type=submit]:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type=button][disabled]:focus,input[type=button][disabled]:hover,input[type=reset][disabled]:focus,input[type=reset][disabled]:hover,input[type=submit][disabled]:focus,input[type=submit][disabled]:hover{background-color:#06f;border-color:#06f}.button.button-outline,button.button-outline,input[type=button].button-outline,input[type=reset].button-outline,input[type=submit].button-outline{background-color:transparent;color:#06f}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type=button].button-outline:focus,input[type=button].button-outline:hover,input[type=reset].button-outline:focus,input[type=reset].button-outline:hover,input[type=submit].button-outline:focus,input[type=submit].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type=button].button-outline[disabled]:focus,input[type=button].button-outline[disabled]:hover,input[type=reset].button-outline[disabled]:focus,input[type=reset].button-outline[disabled]:hover,input[type=submit].button-outline[disabled]:focus,input[type=submit].button-outline[disabled]:hover{border-color:inherit;color:#06f}.button.button-clear,button.button-clear,input[type=button].button-clear,input[type=reset].button-clear,input[type=submit].button-clear{background-color:transparent;border-color:transparent;color:#06f}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type=button].button-clear:focus,input[type=button].button-clear:hover,input[type=reset].button-clear:focus,input[type=reset].button-clear:hover,input[type=submit].button-clear:focus,input[type=submit].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type=button].button-clear[disabled]:focus,input[type=button].button-clear[disabled]:hover,input[type=reset].button-clear[disabled]:focus,input[type=reset].button-clear[disabled]:hover,input[type=submit].button-clear[disabled]:focus,input[type=submit].button-clear[disabled]:hover{color:#06f}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:.3rem solid #06f;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:.1rem solid #f4f5f6;margin:3rem 0}input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{appearance:none;background-color:transparent;border:.1rem solid #404040;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1rem;width:100%}input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{border-color:#06f;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type=checkbox],input[type=radio]{display:inline}.label-inline{display:inline-block;font-weight:400;margin-left:.5rem}.container{margin:0 auto;max-width:112rem;padding:0 2rem;position:relative;width:100%}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{align-self:center}@media (min-width:40rem){.row{flex-direction:row;margin-left:-1rem;width:calc(100% + 2rem)}.row .column{margin-bottom:inherit;padding:0 1rem}}a{color:#06f;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:700}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right}[v-cloak]{display:none}body{background-color:#000;color:#fff;font-family:Verdana,Arial,sans-serif;font-size:10pt;padding-bottom:3rem}@media screen and (min-width:768px){body{padding-top:3rem}}input,textarea{color:#fff}#container{background-color:#202020;margin-top:2rem;padding:1rem;box-shadow:0 0 50px #fcf6cf;border:solid 1px #000}@media screen and (min-width:768px){#container{width:768px;margin-left:auto;margin-right:auto}}.header{position:relative}.header img{float:left;margin-right:1rem}.header .wifistatus{position:absolute;right:0;top:0}.header .wifistatus .indicator{display:inline-block;width:1rem;height:1rem;border-radius:50%;margin-right:.5rem}.header .wifistatus .indicator[data-status=connected]{background-color:#396}.header .wifistatus .indicator[data-status=disconnected]{border:solid 1px grey}.header .wifistatus .indicator[data-status=connecting]{background-color:#f93}.header .wifistatus .indicator[data-status=error]{background-color:#c00}h1{font-size:16pt;margin:0}h2{color:silver;font-size:10pt;margin:0}h3{color:grey;background-color:#282828;font-size:14pt;border-bottom:solid 1px grey}.version{color:grey;font-size:8pt;text-align:center;margin-top:2rem}.tabs{clear:both;margin-top:3rem}.tabs .button{background-color:#404040;color:#fff!important;border-color:grey}.tabs .button.button-outline{background-color:transparent}input[disabled]{cursor:not-allowed;color:grey;background-color:#262626}.label-inline{margin-right:2rem}.hint{display:block;font-size:8pt;color:grey;margin-bottom:1.5rem}.loading{margin-top:3rem;text-align:center}.suboptions{margin-left:5rem}.buttons{text-align:center}.slider{-webkit-appearance:none;width:100%;height:.5rem;border-radius:.25rem;background:#404040;outline:0}.slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:2rem;height:2rem;border-radius:50%;background:#fcf6cf;cursor:pointer}.slider::-moz-range-thumb{width:2rem;height:2rem;border-radius:50%;background:#fcf6cf;cursor:pointer} \ No newline at end of file diff --git a/web/dist/bundle.js b/web/dist/bundle.js new file mode 100644 index 0000000..6ded72a --- /dev/null +++ b/web/dist/bundle.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.axios=e():t.axios=e()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){"use strict";function r(t){var e=new a(t),n=o(a.prototype.request,e);return i.extend(n,a.prototype,e),i.extend(n,e),n}var i=n(2),o=n(3),a=n(5),s=n(6),c=r(s);c.Axios=a,c.create=function(t){return r(i.merge(s,t))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(20),c.all=function(t){return Promise.all(t)},c.spread=n(25),t.exports=c,t.exports.default=c},function(t,e,n){"use strict";function r(t){return"[object Array]"===u.call(t)}function i(t){return null!==t&&"object"==typeof t}function o(t){return"[object Function]"===u.call(t)}function a(t,e){if(null!==t&&void 0!==t)if("object"!=typeof t&&(t=[t]),r(t))for(var n=0,i=t.length;n=200&&t<300}};s.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(t){s.headers[t]={}}),i.forEach(["post","put","patch"],function(t){s.headers[t]=i.merge(a)}),t.exports=s},function(t,e,n){"use strict";var r=n(2);t.exports=function(t,e){r.forEach(t,function(n,r){r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])})}},function(t,e,n){"use strict";var r=n(2),i=n(9),o=n(12),a=n(13),s=n(14),c=n(10),u="undefined"!=typeof window&&window.btoa&&window.btoa.bind(window)||n(15);t.exports=function(t){return new Promise(function(e,l){var f=t.data,p=t.headers;r.isFormData(f)&&delete p["Content-Type"];var d=new XMLHttpRequest,h="onreadystatechange",v=!1;if("undefined"==typeof window||!window.XDomainRequest||"withCredentials"in d||s(t.url)||(d=new window.XDomainRequest,h="onload",v=!0,d.onprogress=function(){},d.ontimeout=function(){}),t.auth){var m=t.auth.username||"",g=t.auth.password||"";p.Authorization="Basic "+u(m+":"+g)}if(d.open(t.method.toUpperCase(),o(t.url,t.params,t.paramsSerializer),!0),d.timeout=t.timeout,d[h]=function(){if(d&&(4===d.readyState||v)&&(0!==d.status||d.responseURL&&0===d.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in d?a(d.getAllResponseHeaders()):null,r={data:t.responseType&&"text"!==t.responseType?d.response:d.responseText,status:1223===d.status?204:d.status,statusText:1223===d.status?"No Content":d.statusText,headers:n,config:t,request:d};i(e,l,r),d=null}},d.onerror=function(){l(c("Network Error",t,null,d)),d=null},d.ontimeout=function(){l(c("timeout of "+t.timeout+"ms exceeded",t,"ECONNABORTED",d)),d=null},r.isStandardBrowserEnv()){var y=n(16),_=(t.withCredentials||s(t.url))&&t.xsrfCookieName?y.read(t.xsrfCookieName):void 0;_&&(p[t.xsrfHeaderName]=_)}if("setRequestHeader"in d&&r.forEach(p,function(t,e){void 0===f&&"content-type"===e.toLowerCase()?delete p[e]:d.setRequestHeader(e,t)}),t.withCredentials&&(d.withCredentials=!0),t.responseType)try{d.responseType=t.responseType}catch(e){if("json"!==t.responseType)throw e}"function"==typeof t.onDownloadProgress&&d.addEventListener("progress",t.onDownloadProgress),"function"==typeof t.onUploadProgress&&d.upload&&d.upload.addEventListener("progress",t.onUploadProgress),t.cancelToken&&t.cancelToken.promise.then(function(t){d&&(d.abort(),l(t),d=null)}),void 0===f&&(f=null),d.send(f)})}},function(t,e,n){"use strict";var r=n(10);t.exports=function(t,e,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?e(r("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)}},function(t,e,n){"use strict";var r=n(11);t.exports=function(t,e,n,i,o){var a=new Error(t);return r(a,e,n,i,o)}},function(t,e){"use strict";t.exports=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t}},function(t,e,n){"use strict";function r(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var i=n(2);t.exports=function(t,e,n){if(!e)return t;var o;if(n)o=n(e);else if(i.isURLSearchParams(e))o=e.toString();else{var a=[];i.forEach(e,function(t,e){null!==t&&void 0!==t&&(i.isArray(t)&&(e+="[]"),i.isArray(t)||(t=[t]),i.forEach(t,function(t){i.isDate(t)?t=t.toISOString():i.isObject(t)&&(t=JSON.stringify(t)),a.push(r(e)+"="+r(t))}))}),o=a.join("&")}return o&&(t+=(-1===t.indexOf("?")?"?":"&")+o),t}},function(t,e,n){"use strict";var r=n(2),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];t.exports=function(t){var e,n,o,a={};return t?(r.forEach(t.split("\n"),function(t){if(o=t.indexOf(":"),e=r.trim(t.substr(0,o)).toLowerCase(),n=r.trim(t.substr(o+1)),e){if(a[e]&&i.indexOf(e)>=0)return;a[e]="set-cookie"===e?(a[e]?a[e]:[]).concat([n]):a[e]?a[e]+", "+n:n}}),a):a}},function(t,e,n){"use strict";var r=n(2);t.exports=r.isStandardBrowserEnv()?function(){function t(t){var e=t;return n&&(i.setAttribute("href",e),e=i.href),i.setAttribute("href",e),{href:i.href,protocol:i.protocol?i.protocol.replace(/:$/,""):"",host:i.host,search:i.search?i.search.replace(/^\?/,""):"",hash:i.hash?i.hash.replace(/^#/,""):"",hostname:i.hostname,port:i.port,pathname:"/"===i.pathname.charAt(0)?i.pathname:"/"+i.pathname}}var e,n=/(msie|trident)/i.test(navigator.userAgent),i=document.createElement("a");return e=t(window.location.href),function(n){var i=r.isString(n)?t(n):n;return i.protocol===e.protocol&&i.host===e.host}}():function(){return!0}},function(t,e){"use strict";function n(){this.message="String contains an invalid character"}var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";n.prototype=new Error,n.prototype.code=5,n.prototype.name="InvalidCharacterError",t.exports=function(t){for(var e,i,o=String(t),a="",s=0,c=r;o.charAt(0|s)||(c="=",s%1);a+=c.charAt(63&e>>8-s%1*8)){if((i=o.charCodeAt(s+=.75))>255)throw new n;e=e<<8|i}return a}},function(t,e,n){"use strict";var r=n(2);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,a){var s=[];s.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),r.isString(i)&&s.push("path="+i),r.isString(o)&&s.push("domain="+o),!0===a&&s.push("secure"),document.cookie=s.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";function r(){this.handlers=[]}var i=n(2);r.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},r.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},r.prototype.forEach=function(t){i.forEach(this.handlers,function(e){null!==e&&t(e)})},t.exports=r},function(t,e,n){"use strict";function r(t){t.cancelToken&&t.cancelToken.throwIfRequested()}var i=n(2),o=n(19),a=n(20),s=n(6),c=n(21),u=n(22);t.exports=function(t){r(t),t.baseURL&&!c(t.url)&&(t.url=u(t.baseURL,t.url)),t.headers=t.headers||{},t.data=o(t.data,t.headers,t.transformRequest),t.headers=i.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),i.forEach(["delete","get","head","post","put","patch","common"],function(e){delete t.headers[e]});return(t.adapter||s.adapter)(t).then(function(e){return r(t),e.data=o(e.data,e.headers,t.transformResponse),e},function(e){return a(e)||(r(t),e&&e.response&&(e.response.data=o(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},function(t,e,n){"use strict";var r=n(2);t.exports=function(t,e,n){return r.forEach(n,function(n){t=n(t,e)}),t}},function(t,e){"use strict";t.exports=function(t){return!(!t||!t.__CANCEL__)}},function(t,e){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e){"use strict";function n(t){this.message=t}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,t.exports=n},function(t,e,n){"use strict";function r(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise(function(t){e=t});var n=this;t(function(t){n.reason||(n.reason=new i(t),e(n.reason))})}var i=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var t;return{token:new r(function(e){t=e}),cancel:t}},t.exports=r},function(t,e){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}}])}),function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Vue=e()}(this,function(){"use strict";function t(t){return void 0===t||null===t}function e(t){return void 0!==t&&null!==t}function n(t){return!0===t}function r(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function i(t){return null!==t&&"object"==typeof t}function o(t){return"[object Object]"===mn.call(t)}function a(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function s(t){return null==t?"":"object"==typeof t?JSON.stringify(t,null,2):String(t)}function c(t){var e=parseFloat(t);return isNaN(e)?t:e}function u(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i-1)return t.splice(n,1)}}function f(t,e){return _n.call(t,e)}function p(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}function d(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function h(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function v(t,e){for(var n in e)t[n]=e[n];return t}function m(t){for(var e={},n=0;n0&&(G((c=i(c,(a||"")+"_"+s))[0])&&G(l)&&(f[u]=k(l.text+c[0].text),c.shift()),f.push.apply(f,c)):r(c)?G(l)?f[u]=k(l.text+c):""!==c&&f.push(k(c)):G(c)&&G(l)?f[u]=k(l.text+c.text):(n(o._isVList)&&e(c.tag)&&t(c.key)&&e(a)&&(c.key="__vlist"+a+"_"+s+"__"),f.push(c)));return f}(u):void 0:c===Dr&&(s=function(t){for(var e=0;e=0||n.indexOf(t[i])<0)&&r.push(t[i]);return r}return t}(n[o],r[o],i[o]));return e}(t);r&&v(t.extendOptions,r),(e=t.options=F(n,t.extendOptions)).name&&(e.components[e.name]=t)}}return e}function Et(t){this._init(t)}function Lt(t){return t&&(t.Ctor.options.name||t.tag)}function It(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"==typeof t?t.split(",").indexOf(e)>-1:(n=t,!("[object RegExp]"!==mn.call(n))&&t.test(e));var n}function Dt(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var s=Lt(a.componentOptions);s&&!e(s)&&Ft(n,o,r,i)}}}function Ft(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,l(n,e)}function Nt(t,n){return{staticClass:Pt(t.staticClass,n.staticClass),class:e(t.class)?[t.class,n.class]:n.class}}function Pt(t,e){return t?e?t+" "+e:t:e||""}function Mt(t){return Array.isArray(t)?function(t){for(var n,r="",i=0,o=t.length;i=0&&" "===(m=t.charAt(v));v--);m&&_i.test(m)||(l=!0)}}else void 0===o?(h=i+1,o=t.slice(0,i).trim()):e();if(void 0===o?o=t.slice(0,i).trim():0!==h&&e(),a)for(i=0;i-1?{exp:t.slice(0,zr),key:'"'+t.slice(zr+1)+'"'}:{exp:t,key:null};for(Hr=t,zr=Wr=qr=0;!ce();)ue(Vr=se())?le(Vr):91===Vr&&function(t){var e=1;for(Wr=zr;!ce();)if(t=se(),ue(t))le(t);else if(91===t&&e++,93===t&&e--,0===e){qr=zr;break}}(Vr);return{exp:t.slice(0,Wr),key:t.slice(Wr+1,qr)}}(t);return null===n.key?t+"="+e:"$set("+n.exp+", "+n.key+", "+e+")"}function se(){return Hr.charCodeAt(++zr)}function ce(){return zr>=Ur}function ue(t){return 34===t||39===t}function le(t){for(var e=t;!ce()&&(t=se())!==e;);}function fe(t,e,n,r,i){e=(o=e)._withTask||(o._withTask=function(){hr=!0;var t=o.apply(null,arguments);return hr=!1,t}),n&&(e=function(t,e,n){var r=Jr;return function i(){null!==t.apply(null,arguments)&&pe(e,i,n,r)}}(e,t,r)),Jr.addEventListener(t,e,Vn?{capture:r,passive:i}:r);var o}function pe(t,e,n,r){(r||Jr).removeEventListener(t,e._withTask||e,n)}function de(n,r){if(!t(n.data.on)||!t(r.data.on)){var i=r.data.on||{},o=n.data.on||{};Jr=r.elm,function(t){if(e(t[bi])){var n=Pn?"change":"input";t[n]=[].concat(t[bi],t[n]||[]),delete t[bi]}e(t[wi])&&(t.change=[].concat(t[wi],t.change||[]),delete t[wi])}(i),J(i,o,fe,pe,r.context),Jr=void 0}}function he(n,r){if(!t(n.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=n.data.domProps||{},u=r.data.domProps||{};e(u.__ob__)&&(u=r.data.domProps=v({},u));for(i in s)t(u[i])&&(a[i]="");for(i in u){if(o=u[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i){a._value=o;var l=t(o)?"":String(o);p=l,!(f=a).composing&&("OPTION"===f.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(f,p)||function(t,n){var r=t.value,i=t._vModifiers;if(e(i)){if(i.lazy)return!1;if(i.number)return c(r)!==c(n);if(i.trim)return r.trim()!==n.trim()}return r!==n}(f,p))&&(a.value=l)}else a[i]=o}}var f,p}function ve(t){var e=me(t.style);return t.staticStyle?v(t.staticStyle,e):e}function me(t){return Array.isArray(t)?m(t):"string"==typeof t?ki(t):t}function ge(n,r){var i=r.data,o=n.data;if(!(t(i.staticStyle)&&t(i.style)&&t(o.staticStyle)&&t(o.style))){var a,s,c=r.elm,u=o.staticStyle,l=o.normalizedStyle||o.style||{},f=u||l,p=me(r.data.style)||{};r.data.normalizedStyle=e(p.__ob__)?v({},p):p;var d=function(t,e){for(var n,r={},i=t;i.componentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=ve(i.data))&&v(r,n);(n=ve(t.data))&&v(r,n);for(var o=t;o=o.parent;)o.data&&(n=ve(o.data))&&v(r,n);return r}(r);for(s in f)t(d[s])&&Si(c,s,"");for(s in d)(a=d[s])!==f[s]&&Si(c,s,null==a?"":a)}}function ye(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function _e(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function be(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&v(e,Ei(t.name||"v")),v(e,t),e}return"string"==typeof t?Ei(t):void 0}}function we(t){Ri(function(){Ri(t)})}function $e(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),ye(t,e))}function xe(t,e){t._transitionClasses&&l(t._transitionClasses,e),_e(t,e)}function ke(t,e,n){var r=Ce(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ii?Ni:Mi,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ii,l=a,f=o.length):e===Di?u>0&&(n=Di,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ii:Di:null)?n===Ii?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ii&&Bi.test(r[Fi+"Property"])}}function Ae(t,e){for(;t.length1}function Le(t,e){!0!==e.data.show&&Oe(e)}function Ie(t,e,n){De(t,e,n),(Pn||Rn)&&setTimeout(function(){De(t,e,n)},0)}function De(t,e,n){var r=e.value,i=t.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=t.options.length;s-1,a.selected!==o&&(a.selected=o);else if(y(Ne(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));i||(t.selectedIndex=-1)}}function Fe(t,e){return e.every(function(e){return!y(e,t)})}function Ne(t){return"_value"in t?t._value:t.value}function Pe(t){t.target.composing=!0}function Me(t){t.target.composing&&(t.target.composing=!1,Re(t.target,"input"))}function Re(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Be(t){return!t.componentInstance||t.data&&t.data.transition?t:Be(t.componentInstance._vnode)}function Ue(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Ue(Q(e.children)):t}function He(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[wn(o)]=i[o];return e}function Ve(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function ze(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function We(t){t.data.newPos=t.elm.getBoundingClientRect()}function qe(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,i=e.top-n.top;if(r||i){t.data.moved=!0;var o=t.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}function Je(t,e){var n=e?jo:To;return t.replace(n,function(t){return Oo[t]})}function Ke(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:function(t){for(var e={},n=0,r=t.length;n':'
',ko.innerHTML.indexOf(" ")>0}var vn=Object.freeze({}),mn=Object.prototype.toString,gn=u("slot,component",!0),yn=u("key,ref,slot,slot-scope,is"),_n=Object.prototype.hasOwnProperty,bn=/-(\w)/g,wn=p(function(t){return t.replace(bn,function(t,e){return e?e.toUpperCase():""})}),$n=p(function(t){return t.charAt(0).toUpperCase()+t.slice(1)}),xn=/\B([A-Z])/g,kn=p(function(t){return t.replace(xn,"-$1").toLowerCase()}),Cn=function(t,e,n){return!1},An=function(t){return t},Sn="data-server-rendered",On=["component","directive","filter"],Tn=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],jn={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:Cn,isReservedAttr:Cn,isUnknownElement:Cn,getTagNamespace:g,parsePlatformTagName:An,mustUseProp:Cn,_lifecycleHooks:Tn},En=/[^\w.$]/,Ln="__proto__"in{},In="undefined"!=typeof window,Dn="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,Fn=Dn&&WXEnvironment.platform.toLowerCase(),Nn=In&&window.navigator.userAgent.toLowerCase(),Pn=Nn&&/msie|trident/.test(Nn),Mn=Nn&&Nn.indexOf("msie 9.0")>0,Rn=Nn&&Nn.indexOf("edge/")>0,Bn=Nn&&Nn.indexOf("android")>0||"android"===Fn,Un=Nn&&/iphone|ipad|ipod|ios/.test(Nn)||"ios"===Fn,Hn=(Nn&&/chrome\/\d+/.test(Nn),{}.watch),Vn=!1;if(In)try{var zn={};Object.defineProperty(zn,"passive",{get:function(){Vn=!0}}),window.addEventListener("test-passive",null,zn)}catch(t){}var Wn,qn,Jn=function(){return void 0===Wn&&(Wn=!In&&"undefined"!=typeof global&&"server"===global.process.env.VUE_ENV),Wn},Kn=In&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Xn="undefined"!=typeof Symbol&&x(Symbol)&&"undefined"!=typeof Reflect&&x(Reflect.ownKeys);qn="undefined"!=typeof Set&&x(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var Gn=g,Zn=0,Yn=function(){this.id=Zn++,this.subs=[]};Yn.prototype.addSub=function(t){this.subs.push(t)},Yn.prototype.removeSub=function(t){l(this.subs,t)},Yn.prototype.depend=function(){Yn.target&&Yn.target.addDep(this)},Yn.prototype.notify=function(){for(var t=this.subs.slice(),e=0,n=t.length;eSr&&$r[n].id>t.id;)n--;$r.splice(n+1,0,t)}else $r.push(t);Cr||(Cr=!0,z(ut))}}(this)},Tr.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||i(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){B(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},Tr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Tr.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},Tr.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||l(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var jr={enumerable:!0,configurable:!0,get:g,set:g},Er={lazy:!0};Ct(At.prototype);var Lr={init:function(t,n,r,i){if(!t.componentInstance||t.componentInstance._isDestroyed)(t.componentInstance=function(t,n,o,a){var s={_isComponent:!0,parent:wr,_parentVnode:t,_parentElm:r||null,_refElm:i||null},c=t.data.inlineTemplate;return e(c)&&(s.render=c.render,s.staticRenderFns=c.staticRenderFns),new t.componentOptions.Ctor(s)}(t)).$mount(n?t.elm:void 0,n);else if(t.data.keepAlive){var o=t;Lr.prepatch(o,o)}},prepatch:function(t,e){var n=e.componentOptions;!function(t,e,n,r,i){var o=!!(i||t.$options._renderChildren||r.data.scopedSlots||t.$scopedSlots!==vn);if(t.$options._parentVnode=r,t.$vnode=r,t._vnode&&(t._vnode.parent=r),t.$options._renderChildren=i,t.$attrs=r.data&&r.data.attrs||vn,t.$listeners=n||vn,e&&t.$options.props){ar.shouldConvert=!1;for(var a=t._props,s=t.$options._propKeys||[],c=0;c1?h(n):n;for(var r=h(arguments,1),i=0,o=n.length;iparseInt(this.max)&&Ft(a,s[0],s,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={};e.get=function(){return jn},Object.defineProperty(t,"config",e),t.util={warn:Gn,extend:v,mergeOptions:F,defineReactive:O},t.set=T,t.delete=j,t.nextTick=z,t.options=Object.create(null),On.forEach(function(e){t.options[e+"s"]=Object.create(null)}),t.options._base=t,v(t.options.components,Br),t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=h(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this},t.mixin=function(t){return this.options=F(this.options,t),this},function(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,i=t._Ctor||(t._Ctor={});if(i[r])return i[r];var o=t.name||n.options.name,a=function(t){this._init(t)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=e++,a.options=F(n.options,t),a.super=n,a.options.props&&function(t){var e=t.options.props;for(var n in e)lt(t.prototype,"_props",n)}(a),a.options.computed&&function(t){var e=t.options.computed;for(var n in e)ft(t.prototype,n,e[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,On.forEach(function(t){a[t]=n[t]}),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=t,a.sealedOptions=v({},a.options),i[r]=a,a}}(t),n=t,On.forEach(function(t){n[t]=function(e,n){return n?("component"===t&&o(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}});var n}(Et),Object.defineProperty(Et.prototype,"$isServer",{get:Jn}),Object.defineProperty(Et.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Et.version="2.5.13";var Ur,Hr,Vr,zr,Wr,qr,Jr,Kr,Xr=u("style,class"),Gr=u("input,textarea,option,select,progress"),Zr=function(t,e,n){return"value"===n&&Gr(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Yr=u("contenteditable,draggable,spellcheck"),Qr=u("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),ti="http://www.w3.org/1999/xlink",ei=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},ni=function(t){return ei(t)?t.slice(6,t.length):""},ri=function(t){return null==t||!1===t},ii={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},oi=u("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),ai=u("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),si=function(t){return oi(t)||ai(t)},ci=Object.create(null),ui=u("text,number,password,search,email,tel,url"),li=Object.freeze({createElement:function(t,e){var n=document.createElement(t);return"select"!==t?n:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)},createElementNS:function(t,e){return document.createElementNS(ii[t],e)},createTextNode:function(t){return document.createTextNode(t)},createComment:function(t){return document.createComment(t)},insertBefore:function(t,e,n){t.insertBefore(e,n)},removeChild:function(t,e){t.removeChild(e)},appendChild:function(t,e){t.appendChild(e)},parentNode:function(t){return t.parentNode},nextSibling:function(t){return t.nextSibling},tagName:function(t){return t.tagName},setTextContent:function(t,e){t.textContent=e},setAttribute:function(t,e,n){t.setAttribute(e,n)}}),fi={create:function(t,e){Ut(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Ut(t,!0),Ut(e))},destroy:function(t){Ut(t,!0)}},pi=new tr("",{},[]),di=["create","activate","update","remove","destroy"],hi={create:zt,update:zt,destroy:function(t){zt(t,pi)}},vi=Object.create(null),mi=[fi,hi],gi={create:Jt,update:Jt},yi={create:Xt,update:Xt},_i=/[\w).+\-_$\]]/,bi="__r",wi="__c",$i={create:de,update:de},xi={create:he,update:he},ki=p(function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach(function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e}),Ci=/^--/,Ai=/\s*!important$/,Si=function(t,e,n){if(Ci.test(e))t.style.setProperty(e,n);else if(Ai.test(n))t.style.setProperty(e,n.replace(Ai,""),"important");else{var r=Ti(e);if(Array.isArray(n))for(var i=0,o=n.length;id?h(n,t(i[_+1])?null:i[_+1].elm,i,p,_,o):p>_&&m(0,r,f,d)}(c,p,d,o,s):e(d)?(e(r.text)&&C.setTextContent(c,""),h(c,null,d,0,d.length-1,o)):e(p)?m(0,p,0,p.length-1):e(r.text)&&C.setTextContent(c,""):r.text!==i.text&&C.setTextContent(c,i.text),e(l)&&e(u=l.hook)&&e(u=u.postpatch)&&u(r,i)}}}function _(t,r,i){if(n(i)&&e(t.parent))t.parent.data.pendingInsert=r;else for(var o=0;o-1?ci[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:ci[t]=/HTMLUnknownElement/.test(e.toString())},v(Et.options.directives,Vi),v(Et.options.components,Ji),Et.prototype.__patch__=In?Ui:g,Et.prototype.$mount=function(t,e){return function(t,e,n){t.$el=e,t.$options.render||(t.$options.render=nr),ct(t,"beforeMount");return new Tr(t,function(){t._update(t._render(),n)},g,null,!0),n=!1,null==t.$vnode&&(t._isMounted=!0,ct(t,"mounted")),t}(this,t=t&&In?Bt(t):void 0,e)},Et.nextTick(function(){jn.devtools&&Kn&&Kn.emit("init",Et)},0);var Ki,Xi=/\{\{((?:.|\n)+?)\}\}/g,Gi=/[-.*+?^${}()|[\]\/\\]/g,Zi=p(function(t){var e=t[0].replace(Gi,"\\$&"),n=t[1].replace(Gi,"\\$&");return new RegExp(e+"((?:.|\\n)+?)"+n,"g")}),Yi={staticKeys:["staticClass"],transformNode:function(t,e){e.warn;var n=ie(t,"class");n&&(t.staticClass=JSON.stringify(n));var r=re(t,"class",!1);r&&(t.classBinding=r)},genData:function(t){var e="";return t.staticClass&&(e+="staticClass:"+t.staticClass+","),t.classBinding&&(e+="class:"+t.classBinding+","),e}},Qi={staticKeys:["staticStyle"],transformNode:function(t,e){e.warn;var n=ie(t,"style");n&&(t.staticStyle=JSON.stringify(ki(n)));var r=re(t,"style",!1);r&&(t.styleBinding=r)},genData:function(t){var e="";return t.staticStyle&&(e+="staticStyle:"+t.staticStyle+","),t.styleBinding&&(e+="style:("+t.styleBinding+"),"),e}},to=u("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),eo=u("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),no=u("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),ro=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,io="[a-zA-Z_][\\w\\-\\.]*",oo="((?:"+io+"\\:)?"+io+")",ao=new RegExp("^<"+oo),so=/^\s*(\/?)>/,co=new RegExp("^<\\/"+oo+"[^>]*>"),uo=/^]+>/i,lo=/^/g,"$1").replace(//g,"$1")),Lo(p,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""});l+=t.length-h.length,t=h,r(p,l-f,l)}else{var v=t.indexOf("<");if(0===v){if(lo.test(t)){var m=t.indexOf("--\x3e");if(m>=0){e.shouldKeepComment&&e.comment(t.substring(4,m)),n(m+3);continue}}if(fo.test(t)){var g=t.indexOf("]>");if(g>=0){n(g+2);continue}}var y=t.match(uo);if(y){n(y[0].length);continue}var _=t.match(co);if(_){var b=l;n(_[0].length),r(_[1],b,l);continue}var w=function(){var e=t.match(ao);if(e){var r={tagName:e[1],attrs:[],start:l};n(e[0].length);for(var i,o;!(i=t.match(so))&&(o=t.match(ro));)n(o[0].length),r.attrs.push(o);if(i)return r.unarySlash=i[1],n(i[0].length),r.end=l,r}}();if(w){!function(t){var n=t.tagName,i=t.unarySlash;s&&("p"===o&&no(n)&&r(o),u(n)&&o===n&&r(n));for(var l=c(n)||!!i,f=t.attrs.length,p=new Array(f),d=0;d=0){for(x=t.slice(v);!(co.test(x)||ao.test(x)||lo.test(x)||fo.test(x)||(k=x.indexOf("<",1))<0);)v+=k,x=t.slice(v);$=t.substring(0,v),n(v)}v<0&&($=t,t=""),e.chars&&$&&e.chars($)}if(t===i){e.chars&&e.chars(t);break}}r()}(t,{warn:ho,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecodeNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,start:function(t,a,u){var l=i&&i.ns||wo(t);Pn&&"svg"===l&&(a=function(t){for(var e=[],n=0;nc&&(s.push(o=t.slice(c,i)),a.push(JSON.stringify(o)));var u=Gt(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c1?1:0:1:t?Math.min(t,2):0;var n}(e,n.length)]?n[e].trim():t}function a(t){return JSON.parse(JSON.stringify(t))}function s(t){for(var n=arguments,r=Object(t),i=1;i=97&&e<=122||e>=65&&e<=90?"ident":e>=49&&e<=57?"number":"else"}function d(t){var e=t.trim();return("0"!==t.charAt(0)||!isNaN(t))&&(n=e,N.test(n)?function(t){var e=t.charCodeAt(0);return e!==t.charCodeAt(t.length-1)||34!==e&&39!==e?t:t.slice(1,-1)}(e):"*"+e);var n}var h,v=Object.prototype.toString,m="[object Object]",g=Object.prototype.hasOwnProperty,y="undefined"!=typeof Intl&&void 0!==Intl.DateTimeFormat,_="undefined"!=typeof Intl&&void 0!==Intl.NumberFormat,b={beforeCreate:function(){var t=this.$options;if(t.i18n=t.i18n||(t.__i18n?{}:null),t.i18n){if(t.i18n instanceof M){if(t.__i18n)try{var e={};t.__i18n.forEach(function(t){e=s(e,JSON.parse(t))}),Object.keys(e).forEach(function(n){t.i18n.mergeLocaleMessage(n,e[n])})}catch(t){}this._i18n=t.i18n,this._i18nWatcher=this._i18n.watchI18nData(),this._i18n.subscribeDataChanging(this),this._subscribing=!0}else if(n(t.i18n)){if(this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof M&&(t.i18n.root=this.$root.$i18n,t.i18n.fallbackLocale=this.$root.$i18n.fallbackLocale,t.i18n.silentTranslationWarn=this.$root.$i18n.silentTranslationWarn),t.__i18n)try{var r={};t.__i18n.forEach(function(t){r=s(r,JSON.parse(t))}),t.i18n.messages=r}catch(t){}this._i18n=new M(t.i18n),this._i18nWatcher=this._i18n.watchI18nData(),this._i18n.subscribeDataChanging(this),this._subscribing=!0,(void 0===t.i18n.sync||t.i18n.sync)&&(this._localeWatcher=this.$i18n.watchLocale())}}else this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof M?(this._i18n=this.$root.$i18n,this._i18n.subscribeDataChanging(this),this._subscribing=!0):t.parent&&t.parent.$i18n&&t.parent.$i18n instanceof M&&(this._i18n=t.parent.$i18n,this._i18n.subscribeDataChanging(this),this._subscribing=!0)},beforeDestroy:function(){this._i18n&&(this._subscribing&&(this._i18n.unsubscribeDataChanging(this),delete this._subscribing),this._i18nWatcher&&(this._i18nWatcher(),delete this._i18nWatcher),this._localeWatcher&&(this._localeWatcher(),delete this._localeWatcher),this._i18n=null)}},w={name:"i18n",functional:!0,props:{tag:{type:String,default:"span"},path:{type:String,required:!0},locale:{type:String},places:{type:[Array,Object]}},render:function(e,n){var r=n.props,i=n.data,o=n.children,a=n.parent.$i18n;if(o=(o||[]).filter(function(t){return t.tag||(t.text=t.text.trim())}),!a)return o;var s=r.path,c=r.locale,u={},l=r.places||{},f=Array.isArray(l)?l.length>0:Object.keys(l).length>0,p=o.every(function(t){if(t.data&&t.data.attrs){var e=t.data.attrs.place;return void 0!==e&&""!==e}});return f&&o.length>0&&!p&&t("If places prop is set, all child elements must have place prop set."),Array.isArray(l)?l.forEach(function(t,e){u[e]=t}):Object.keys(l).forEach(function(t){u[t]=l[t]}),o.forEach(function(t,e){var n=p?""+t.data.attrs.place:""+e;u[n]=t}),e(r.tag,i,a.i(s,c,u))}},$=function(){this._caches=Object.create(null)};$.prototype.interpolate=function(t,n){var r=this._caches[t];return r||(r=function(t){for(var e=[],n=0,r="";n0)f--,l=j,h[C]();else{if(f=0,!1===(n=d(n)))return!1;h[A]()}};null!==l;)if(u++,"\\"!==(e=t[u])||!function(){var e=t[u+1];if(l===E&&"'"===e||l===L&&'"'===e)return u++,r="\\"+e,h[C](),!0}()){if(i=p(e),(o=(s=F[l])[i]||s.else||D)===D)return;if(l=o[0],(a=h[o[1]])&&(r=o[2],r=void 0===r?e:r,!1===a()))return;if(l===I)return c}}(t))&&(this._cache[t]=e),e||[]},P.prototype.getPathValue=function(t,n){if(!e(t))return null;var r=this.parsePath(n);if(i=r,Array.isArray(i)&&0===i.length)return null;for(var i,o=r.length,a=t,s=0;s-1)t.splice(n,1)}}(this._dataListeners,t)},M.prototype.watchI18nData=function(){var t=this;return this._vm.$watch("$data",function(){for(var e=t._dataListeners.length;e--;)h.nextTick(function(){t._dataListeners[e]&&t._dataListeners[e].$forceUpdate()})},{deep:!0})},M.prototype.watchLocale=function(){if(!this._sync||!this._root)return null;var t=this._vm;return this._root.vm.$watch("locale",function(e){t.$set(t,"locale",e),t.$forceUpdate()},{immediate:!0})},R.vm.get=function(){return this._vm},R.messages.get=function(){return a(this._getMessages())},R.dateTimeFormats.get=function(){return a(this._getDateTimeFormats())},R.numberFormats.get=function(){return a(this._getNumberFormats())},R.locale.get=function(){return this._vm.locale},R.locale.set=function(t){this._vm.$set(this._vm,"locale",t)},R.fallbackLocale.get=function(){return this._vm.fallbackLocale},R.fallbackLocale.set=function(t){this._vm.$set(this._vm,"fallbackLocale",t)},R.missing.get=function(){return this._missing},R.missing.set=function(t){this._missing=t},R.formatter.get=function(){return this._formatter},R.formatter.set=function(t){this._formatter=t},R.silentTranslationWarn.get=function(){return this._silentTranslationWarn},R.silentTranslationWarn.set=function(t){this._silentTranslationWarn=t},M.prototype._getMessages=function(){return this._vm.messages},M.prototype._getDateTimeFormats=function(){return this._vm.dateTimeFormats},M.prototype._getNumberFormats=function(){return this._vm.numberFormats},M.prototype._warnDefault=function(t,e,n,i){return r(n)?(this.missing&&this.missing.apply(null,[t,e,i]),e):n},M.prototype._isFallbackRoot=function(t){return!t&&!r(this._root)&&this._fallbackRoot},M.prototype._interpolate=function(t,e,i,o,a,s){if(!e)return null;var c=this._path.getPathValue(e,i);if(Array.isArray(c))return c;var u;if(r(c)){if(!n(e))return null;if("string"!=typeof(u=e[i]))return null}else{if("string"!=typeof c)return null;u=c}return u.indexOf("@:")>=0&&(u=this._link(t,e,u,o,a,s)),s?this._render(u,a,s):u},M.prototype._link=function(t,e,n,r,i,o){var a=n,s=a.match(/(@:[\w\-_|.]+)/g);for(var c in s)if(s.hasOwnProperty(c)){var u=s[c],l=u.substr(2),f=this._interpolate(t,e,l,r,"raw"===i?"string":i,"raw"===i?void 0:o);if(this._isFallbackRoot(f)){if(!this._root)throw Error("unexpected error");var p=this._root;f=p._translate(p._getMessages(),p.locale,p.fallbackLocale,l,r,i,o)}a=(f=this._warnDefault(t,l,f,r))?a.replace(u,f):a}return a},M.prototype._render=function(t,e,n){var r=this._formatter.interpolate(t,n);return"string"===e?r.join(""):r},M.prototype._translate=function(t,e,n,i,o,a,s){var c=this._interpolate(e,t[e],i,o,a,s);return r(c)?r(c=this._interpolate(n,t[n],i,o,a,s))?null:c:c},M.prototype._t=function(t,e,n,r){for(var o=[],a=arguments.length-4;a-- >0;)o[a]=arguments[a+4];if(!t)return"";var s=i.apply(void 0,o),c=s.locale||e,u=this._translate(n,c,this.fallbackLocale,t,r,"string",s.params);if(this._isFallbackRoot(u)){if(!this._root)throw Error("unexpected error");return(l=this._root).t.apply(l,[t].concat(o))}return this._warnDefault(c,t,u,r);var l},M.prototype.t=function(t){for(var e=[],n=arguments.length-1;n-- >0;)e[n]=arguments[n+1];return(r=this)._t.apply(r,[t,this.locale,this._getMessages(),null].concat(e));var r},M.prototype._i=function(t,e,n,r,i){var o=this._translate(n,e,this.fallbackLocale,t,r,"raw",i);if(this._isFallbackRoot(o)){if(!this._root)throw Error("unexpected error");return this._root.i(t,e,i)}return this._warnDefault(e,t,o,r)},M.prototype.i=function(t,e,n){return t?("string"!=typeof e&&(e=this.locale),this._i(t,e,this._getMessages(),null,n)):""},M.prototype._tc=function(t,e,n,r,i){for(var a=[],s=arguments.length-5;s-- >0;)a[s]=arguments[s+5];return t?(void 0===i&&(i=1),o((c=this)._t.apply(c,[t,e,n,r].concat(a)),i)):"";var c},M.prototype.tc=function(t,e){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];return(i=this)._tc.apply(i,[t,this.locale,this._getMessages(),null,e].concat(n));var i},M.prototype._te=function(t,e,n){for(var r=[],o=arguments.length-3;o-- >0;)r[o]=arguments[o+3];var a=i.apply(void 0,r).locale||e;return this._exist(n[a],t)},M.prototype.te=function(t,e){return this._te(t,this.locale,this._getMessages(),e)},M.prototype.getLocaleMessage=function(t){return a(this._vm.messages[t]||{})},M.prototype.setLocaleMessage=function(t,e){this._vm.messages[t]=e},M.prototype.mergeLocaleMessage=function(t,e){this._vm.messages[t]=h.util.extend(this._vm.messages[t]||{},e)},M.prototype.getDateTimeFormat=function(t){return a(this._vm.dateTimeFormats[t]||{})},M.prototype.setDateTimeFormat=function(t,e){this._vm.dateTimeFormats[t]=e},M.prototype.mergeDateTimeFormat=function(t,e){this._vm.dateTimeFormats[t]=h.util.extend(this._vm.dateTimeFormats[t]||{},e)},M.prototype._localizeDateTime=function(t,e,n,i,o){var a=e,s=i[a];if((r(s)||r(s[o]))&&(a=n,s=i[a]),r(s)||r(s[o]))return null;var c=s[o],u=a+"__"+o,l=this._dateTimeFormatters[u];return l||(l=this._dateTimeFormatters[u]=new Intl.DateTimeFormat(a,c)),l.format(t)},M.prototype._d=function(t,e,n){if(!n)return new Intl.DateTimeFormat(e).format(t);var r=this._localizeDateTime(t,e,this.fallbackLocale,this._getDateTimeFormats(),n);if(this._isFallbackRoot(r)){if(!this._root)throw Error("unexpected error");return this._root.d(t,n,e)}return r||""},M.prototype.d=function(t){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];var i=this.locale,o=null;return 1===n.length?"string"==typeof n[0]?o=n[0]:e(n[0])&&(n[0].locale&&(i=n[0].locale),n[0].key&&(o=n[0].key)):2===n.length&&("string"==typeof n[0]&&(o=n[0]),"string"==typeof n[1]&&(i=n[1])),this._d(t,i,o)},M.prototype.getNumberFormat=function(t){return a(this._vm.numberFormats[t]||{})},M.prototype.setNumberFormat=function(t,e){this._vm.numberFormats[t]=e},M.prototype.mergeNumberFormat=function(t,e){this._vm.numberFormats[t]=h.util.extend(this._vm.numberFormats[t]||{},e)},M.prototype._localizeNumber=function(t,e,n,i,o){var a=e,s=i[a];if((r(s)||r(s[o]))&&(a=n,s=i[a]),r(s)||r(s[o]))return null;var c=s[o],u=a+"__"+o,l=this._numberFormatters[u];return l||(l=this._numberFormatters[u]=new Intl.NumberFormat(a,c)),l.format(t)},M.prototype._n=function(t,e,n){if(!n)return new Intl.NumberFormat(e).format(t);var r=this._localizeNumber(t,e,this.fallbackLocale,this._getNumberFormats(),n);if(this._isFallbackRoot(r)){if(!this._root)throw Error("unexpected error");return this._root.n(t,n,e)}return r||""},M.prototype.n=function(t){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];var i=this.locale,o=null;return 1===n.length?"string"==typeof n[0]?o=n[0]:e(n[0])&&(n[0].locale&&(i=n[0].locale),n[0].key&&(o=n[0].key)):2===n.length&&("string"==typeof n[0]&&(o=n[0]),"string"==typeof n[1]&&(i=n[1])),this._n(t,i,o)},Object.defineProperties(M.prototype,R),M.availabilities={dateTimeFormat:y,numberFormat:_},M.install=function t(e){(h=e).version&&Number(h.version.split(".")[0]),t.installed=!0,Object.defineProperty(h.prototype,"$i18n",{get:function(){return this._i18n}}),n=h,Object.defineProperty(n.prototype,"$t",{get:function(){var t=this;return function(e){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];var i=t.$i18n;return i._t.apply(i,[e,i.locale,i._getMessages(),t].concat(n))}}}),Object.defineProperty(n.prototype,"$tc",{get:function(){var t=this;return function(e,n){for(var r=[],i=arguments.length-2;i-- >0;)r[i]=arguments[i+2];var o=t.$i18n;return o._tc.apply(o,[e,o.locale,o._getMessages(),t,n].concat(r))}}}),Object.defineProperty(n.prototype,"$te",{get:function(){var t=this;return function(e,n){var r=t.$i18n;return r._te(e,r.locale,r._getMessages(),n)}}}),Object.defineProperty(n.prototype,"$d",{get:function(){var t=this;return function(e){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(i=t.$i18n).d.apply(i,[e].concat(n));var i}}}),Object.defineProperty(n.prototype,"$n",{get:function(){var t=this;return function(e){for(var n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(i=t.$i18n).n.apply(i,[e].concat(n));var i}}}),h.mixin(b),h.directive("t",{bind:c,update:u}),h.component(w.name,w);var n,r=h.config.optionMergeStrategies;r.i18n=r.methods},M.version="7.3.3","undefined"!=typeof window&&window.Vue&&window.Vue.use(M),M});var messages={en:{title:"Stairs",systemID:"System ID",firmwareVersion:"Firmware version: ",copyright:"Copyright © 2017 Mark van Renswoude",loading:"Please wait, loading configuration...",applyButton:"Apply",applyButtonSaving:"Saving...",wifiStatus:{accesspoint:{title:"AP: ",disabled:"Disabled"},stationmode:{title:"WiFi: ",disabled:"Disabled",idle:"Idle",noSSID:"SSID not found",scanCompleted:"Scan completed",connectFailed:"Failed to connect",connectionLost:"Connection lost",disconnected:"Disconnected"}},status:{tabTitle:"Status",title:"Current status"},triggers:{tabTitle:"Triggers",timeTitle:"Time",motionTitle:"Motion"},connection:{tabTitle:"Connection",title:"Connection parameters",accesspoint:"Enable access point",accesspointHint:"Allows for a direct connection from your device to this Stairs module for configuration purposes. The Stairs configuration is available on http://192.168.1.4/ when you are connected to it. Turn it off as soon as station mode is configured, as it is not secured in any way. You can always turn this option back on by pushing the access point button until the LED lights up.",stationmode:"Enable station mode",stationmodeHint:"Connect this Stairs module to your own WiFi router. Please enter the SSID, password and further configuration below.",ssid:"SSID",password:"Password",dhcp:"Use DHCP",dhcpHint:"Automatically assigns an IP address to this Stairs module. You probably want to keep this on unless you know what you're doing.",ipaddress:"IP address",subnetmask:"Subnet mask",gateway:"Gateway",hostname:"Hostname",hostnamePlaceholder:"Default: mac address"}},nl:{title:"Trap",systemID:"Systeem ID",firmwareVersion:"Firmware versie: ",copyright:"Copyright © 2017 Mark van Renswoude",loading:"Een ogenblik geduld, bezig met laden van configuratie...",applyButton:"Apply",applyButtonSaving:"Saving...",wifiStatus:{accesspoint:{title:"AP: ",disabled:"Uitgeschakeld"},stationmode:{title:"WiFi: ",disabled:"Uitgeschakeld",idle:"Slaapstand",noSSID:"SSID niet gevonden",scanCompleted:"Scan afgerond",connectFailed:"Kan geen verbinding maken",connectionLost:"Verbinding verloren",disconnected:"Niet verbonden"}},status:{tabTitle:"Status",title:"Huidige status"},triggers:{tabTitle:"Triggers",timeTitle:"Tijd",motionTitle:"Beweging"},connection:{tabTitle:"Verbinding",title:"Verbinding configuratie",accesspoint:"Access point inschakelen",accesspointhint:"Maakt het mogelijk om een directe connectie vanaf een apparaat naar deze Trap module te maken om de module te configureren. De Trap module is te benaderen via http://192.168.1.4/ nadat je connectie hebt gemaakt. Schakel deze optie uit na het configureren, aangezien deze niet beveiligd is. Je kunt deze optie ook inschakelen door op de Access point knop te drukken totdat de LED aan gaat.",stationmode:"Verbinding met WiFi maken",stationmodehint:"Verbind deze Trap module aan je eigen WiFi router. Vul hieronder het SSID en wachtwoord in, en configureer eventuel de overige opties.",ssid:"SSID",password:"Wachtwoord",dhcp:"Gebruik DHCP",dhcphint:"Automatisch een IP adres toewijzen aan deze Trap module. Waarschijnlijk wil je deze optie aan laten, tenzij je weet waar je mee bezig bent.",ipaddress:"IP adres",subnetmask:"Subnet masker",gateway:"Gateway",hostname:"Hostnaam",hostnamePlaceholder:"Standaard: mac adres"}}};function startApp(){var t=new VueI18n({locale:navigator.language,fallbackLocale:"en",messages:messages});new Vue({el:"#app",i18n:t,data:{loading:!0,saving:!1,loadingIndicator:"|",activeTab:"status",version:{systemID:"loading...",version:"loading..."},wifiStatus:{ap:{enabled:!1,ip:"0.0.0.0"},station:{enabled:!1,status:0,ip:"0.0.0.0"}},connection:{hostname:null,accesspoint:!0,station:!1,ssid:null,password:null,dhcp:!0,ip:null,subnetmask:null,gateway:null},steps:[{value:50},{value:0},{value:0},{value:0},{value:0},{value:70},{value:0},{value:0},{value:0},{value:0},{value:25},{value:0},{value:0},{value:0}]},created:function(){var e=this;document.title=t.t("title"),e.startLoadingIndicator(),e.updateWiFiStatus(),setInterval(e.updateWiFiStatus,5e3),axios.get("/api/version").then(function(t){"object"==typeof t.data&&(e.version=t.data)}).catch(function(t){console.log(t)}),axios.all([axios.get("/api/connection").then(function(t){"object"==typeof t.data&&(e.connection=t.data)}).catch(function(t){console.log(t)})]).then(axios.spread(function(t,n){e.stopLoadingIndicator(),e.loading=!1}))},methods:{applyConnection:function(){var t=this;t.saving||(t.saving=!0,axios.post("/api/connection",{hostname:t.connection.hostname,accesspoint:t.connection.accesspoint,station:t.connection.station,ssid:t.connection.ssid,password:t.connection.password,dhcp:t.connection.dhcp,ip:t.connection.ip,subnetmask:t.connection.subnetmask,gateway:t.connection.gateway}).then(function(t){}).catch(function(t){console.log(t)}).then(function(){t.saving=!1}))},startLoadingIndicator:function(){var t=this;t.loadingStage=0,t.loadingTimer=setInterval(function(){switch(t.loadingStage++,console.log(t.loadingStage),t.loadingStage){case 1:t.loadingIndicator="/";break;case 2:t.loadingIndicator="-";break;case 3:t.loadingIndicator="\\";break;case 4:t.loadingIndicator="|",t.loadingStage=0}},250)},stopLoadingIndicator:function(){clearInterval(this.loadingTimer)},getWiFiStationStatus:function(){if(!this.wifiStatus.station.enabled)return"disconnected";switch(this.wifiStatus.station.status){case 0:case 2:return"connecting";case 1:case 4:case 5:return"error";case 3:return"connected";case 6:default:return"disconnected"}},getWiFiStationStatusText:function(){if(!this.wifiStatus.station.enabled)return t.t("wifiStatus.stationmode.disabled");switch(this.wifiStatus.station.status){case 0:return t.t("wifiStatus.stationmode.idle");case 1:return t.t("wifiStatus.stationmode.noSSID");case 2:return t.t("wifiStatus.stationmode.scanCompleted");case 3:return this.wifiStatus.station.ip;case 4:return t.t("wifiStatus.stationmode.connectFailed");case 5:return t.t("wifiStatus.stationmode.connectionLost");case 6:default:return t.t("wifiStatus.stationmode.disconnected")}},updateWiFiStatus:function(){var t=this;t.saving||axios.get("/api/connection/status").then(function(e){"object"==typeof e.data&&(t.wifiStatus=e.data)}).catch(function(t){console.log(t)})}}})} \ No newline at end of file diff --git a/web/gulpfile.js b/web/gulpfile.js deleted file mode 100644 index 06a443f..0000000 --- a/web/gulpfile.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); -var ts = require('gulp-typescript'); -var uglify = require('gulp-uglify'); -var sass = require('gulp-sass'); -var cleanCSS = require('gulp-clean-css'); -var concat = require('gulp-concat'); -var watch = require('gulp-debounced-watch'); -var plumber = require('gulp-plumber'); - - -var config = -{ - dest: 'static/assets/dist/', - typescriptBase: 'static/assets/ts/', - sassBase: 'static/assets/sass/', - - assets: ['static/assets/ts/**/*.html', 'static/assets/js/**/*.js'] -}; - -config.typescriptSrc = config.typescriptBase + '**/*.ts'; -config.sassSrc = config.sassBase + '**/*.scss'; - - -gulp.task('default', - [ - 'compileTypescript', - 'compileSass', - 'copyAssets' - ], - function(){}); - -gulp.task('watch', - [ - 'compileTypescript', - 'compileSass', - 'copyAssets' - ], - function() - { - watch(config.typescriptSrc, function() { gulp.start('compileTypescript'); }); - watch(config.sassSrc, function() { gulp.start('compileSass'); }); - watch(config.assets, function() { gulp.start('copyAssets'); }); - }); - - -gulp.task('compileTypescript', function() -{ - return gulp.src(config.typescriptSrc, { base: config.typescriptBase }) - .pipe(plumber({ - errorHandler: function (error) - { - console.log(error.message); - this.emit('end'); - }})) - .pipe(ts( - { - noImplicitAny: true, - removeComments: true, - preserveConstEnums: true, - sourceMap: true, - module: 'amd' - })) - .pipe(uglify()) - .pipe(gulp.dest(config.dest)); -}); - - -gulp.task('compileSass', function() -{ - return gulp.src(config.sassSrc) - .pipe(plumber({ - errorHandler: function (error) - { - console.log(error.message); - this.emit('end'); - }})) - .pipe(sass()) - .pipe(concat('bundle.css')) - .pipe(cleanCSS()) - .pipe(gulp.dest(config.dest)); -}); - - -gulp.task('copyAssets', function() -{ - return gulp.src(config.assets) - .pipe(plumber({ - errorHandler: function (error) - { - console.log(error.message); - this.emit('end'); - }})) - .pipe(gulp.dest(config.dest)); -}); \ No newline at end of file diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..1e9d39d --- /dev/null +++ b/web/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + +
+
+
+
+ +

{{ $t('title') }}

+

{{ version.systemID !== null ? $t('systemID') + ': ' + version.systemID : '' }}

+ +
+
+
{{ $t('wifiStatus.accesspoint.title') }} {{ wifiStatus.ap.enabled ? wifiStatus.ap.ip : $t('wifiStatus.accesspoint.disabled') }} +
+
+
{{ $t('wifiStatus.stationmode.title') }} {{ getWiFiStationStatusText() }} +
+
+
+ +
+ {{ $t('loading') }} {{ loadingIndicator }} +
+ +
+
+ + + +
+ +
+

{{ $t('status.title') }}

+ +
+ {{ index + 1 }} + + {{ step.value }} +
+
+ +
+
+
+

{{ $t('triggers.timeTitle') }}

+
+ +
+

{{ $t('triggers.motionTitle') }}

+
+
+
+ +
+
+
+

{{ $t('connection.title') }}

+ + + + {{ $t('connection.accesspointHint') }} + + + + {{ $t('connection.stationmodeHint') }} + + + + + + + + + + {{ $t('connection.dhcpHint') }} + + +
+ + + + + + + + +
+ + + + + +
+ +
+
+
+
+
+ +
+
+
+ {{ $t('copyright') }}
+ {{ version.version !== null ? $t('firmwareVersion') + version.version : '' }} +
+
+
+ + + + \ No newline at end of file diff --git a/web/lang.js b/web/lang.js new file mode 100644 index 0000000..01a9d49 --- /dev/null +++ b/web/lang.js @@ -0,0 +1,127 @@ +var messages = { + en: { + title: 'Stairs', + systemID: 'System ID', + firmwareVersion: 'Firmware version: ', + copyright: 'Copyright © 2017 Mark van Renswoude', + loading: 'Please wait, loading configuration...', + + applyButton: 'Apply', + applyButtonSaving: 'Saving...', + + wifiStatus: { + accesspoint: { + title: 'AP: ', + disabled: 'Disabled' + }, + + stationmode: { + title: 'WiFi: ', + disabled: 'Disabled', + idle: 'Idle', + noSSID: 'SSID not found', + scanCompleted: 'Scan completed', + connectFailed: 'Failed to connect', + connectionLost: 'Connection lost', + disconnected: 'Disconnected' + } + }, + + status: { + tabTitle: 'Status', + title: 'Current status' + }, + + triggers: { + tabTitle: 'Triggers', + timeTitle: 'Time', + motionTitle: 'Motion' + }, + + connection: { + tabTitle: 'Connection', + title: 'Connection parameters', + + accesspoint: 'Enable access point', + accesspointHint: 'Allows for a direct connection from your device to this Stairs module for configuration purposes. The Stairs configuration is available on http://192.168.1.4/ when you are connected to it. Turn it off as soon as station mode is configured, as it is not secured in any way. You can always turn this option back on by pushing the access point button until the LED lights up.', + + stationmode: 'Enable station mode', + stationmodeHint: 'Connect this Stairs module to your own WiFi router. Please enter the SSID, password and further configuration below.', + + ssid: 'SSID', + password: 'Password', + + dhcp: 'Use DHCP', + dhcpHint: 'Automatically assigns an IP address to this Stairs module. You probably want to keep this on unless you know what you\'re doing.', + + ipaddress: 'IP address', + subnetmask: 'Subnet mask', + gateway: 'Gateway', + hostname: 'Hostname', + hostnamePlaceholder: 'Default: mac address' + } + }, + + nl: { + title: 'Trap', + systemID: 'Systeem ID', + firmwareVersion: 'Firmware versie: ', + copyright: 'Copyright © 2017 Mark van Renswoude', + loading: 'Een ogenblik geduld, bezig met laden van configuratie...', + + applyButton: 'Apply', + applyButtonSaving: 'Saving...', + + wifiStatus: { + accesspoint: { + title: 'AP: ', + disabled: 'Uitgeschakeld' + }, + + stationmode: { + title: 'WiFi: ', + disabled: 'Uitgeschakeld', + idle: 'Slaapstand', + noSSID: 'SSID niet gevonden', + scanCompleted: 'Scan afgerond', + connectFailed: 'Kan geen verbinding maken', + connectionLost: 'Verbinding verloren', + disconnected: 'Niet verbonden' + } + }, + + status: { + tabTitle: 'Status', + title: 'Huidige status' + }, + + triggers: { + tabTitle: 'Triggers', + timeTitle: 'Tijd', + motionTitle: 'Beweging' + }, + + connection: { + tabTitle: 'Verbinding', + title: 'Verbinding configuratie', + + accesspoint: 'Access point inschakelen', + accesspointhint: 'Maakt het mogelijk om een directe connectie vanaf een apparaat naar deze Trap module te maken om de module te configureren. De Trap module is te benaderen via http://192.168.1.4/ nadat je connectie hebt gemaakt. Schakel deze optie uit na het configureren, aangezien deze niet beveiligd is. Je kunt deze optie ook inschakelen door op de Access point knop te drukken totdat de LED aan gaat.', + + stationmode: 'Verbinding met WiFi maken', + stationmodehint: 'Verbind deze Trap module aan je eigen WiFi router. Vul hieronder het SSID en wachtwoord in, en configureer eventuel de overige opties.', + + ssid: 'SSID', + password: 'Wachtwoord', + + dhcp: 'Gebruik DHCP', + dhcphint: 'Automatisch een IP adres toewijzen aan deze Trap module. Waarschijnlijk wil je deze optie aan laten, tenzij je weet waar je mee bezig bent.', + + ipaddress: 'IP adres', + subnetmask: 'Subnet masker', + gateway: 'Gateway', + hostname: 'Hostnaam', + hostnamePlaceholder: 'Standaard: mac adres' + } + } +} \ No newline at end of file diff --git a/web/logo.ai b/web/logo.ai new file mode 100644 index 0000000..1b09e41 --- /dev/null +++ b/web/logo.ai @@ -0,0 +1,333 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 21 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator CS6 (Windows) + 2017-12-30T16:13+01:00 + 2017-12-30T16:17:16+01:00 + 2017-12-30T16:17:16+01:00 + + + + 248 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD4AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + 1 + False + False + + 512.000000 + 512.000000 + Points + + + + + Default Swatch Group + 0 + + + + + + application/pdf + + + Document + + + xmp.did:89DEF0EC73EDE7119CCADB31B93B2005 + uuid:b03a2483-4f32-4465-b083-e0550ab05b88 + xmp.did:89DEF0EC73EDE7119CCADB31B93B2005 + proof:pdf + + + + + saved + xmp.iid:89DEF0EC73EDE7119CCADB31B93B2005 + 2017-12-30T16:13:01+01:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 26 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 23 0 obj <>stream +H‰”‘Á +Â0 †ïyŠ¼Àº&M¶õj•0dîàˆxqÂôàëÛ +º¦ ¡¥)ßßÐr°ì‚ÅÕ: L`Q‰_«HÛí¼aª} *†±Ù"”í`ñ|‡)¶6VdÄáºFfÂãévnØ8'ñ|úEÞÿàûÿó]•ûD yšó¿L9{¼7\Qâr ¥g¹…1ÄŠñ)–4ã V5º€¿íM.Wÿ!7]üŠž CÕPt +endstream endobj 26 0 obj <>stream +8;Z]L!=]#/!5bE.$"(^o%O_;W!8uZ9(]Y: +endstream endobj 27 0 obj [/Indexed/DeviceRGB 255 28 0 R] endobj 28 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 21 0 obj <> endobj 29 0 obj [/View/Design] endobj 30 0 obj <>>> endobj 25 0 obj <> endobj 24 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.0 +%%For: (PsychoMark) () +%%Title: (logo.ai) +%%CreationDate: 12/30/2017 4:17 PM +%%Canvassize: 16383 +%%BoundingBox: 113 218 501 623 +%%HiResBoundingBox: 113.6367 218.375 500.3867 622.625 +%%DocumentProcessColors: +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 682 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%AI3_Cropmarks: 41.5 164.5 553.5 676.5 +%AI3_TemplateBox: 297.5 420.5 297.5 420.5 +%AI3_TileBox: -8.5 24.5 603.5 816.5 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 2 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -1232 1218 0.5 1789 914 26 0 0 82 117 0 0 0 1 1 1 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 33 0 obj <>stream +%%BoundingBox: 113 218 501 623 +%%HiResBoundingBox: 113.6367 218.375 500.3867 622.625 +%AI7_Thumbnail: 124 128 8 +%%BeginData: 2021 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDF7FFFF +%%EndData + +endstream endobj 34 0 obj <>stream +%AI12_CompressedDataxœÜ½gwò:Ó0z>ïµò(Iè`z ½)Š)¡Æ†]žïo?’ÜdãFÙïÙç¹÷ºs–g¤Ñhšf¤;c£åÊL¶#Òåw†›?îîr9Üo©˜ýl¨¬VzOÁŸ¬M›Ár°U¦°-;$E/¶›zÆ<-Â÷­ úŸñ|û4¤–6ƒÕo/ö+ô»€Þ}¥‡3ÐmôýTÖ৹߃ŽÑ1"Y³”Å1‚_ÑÖ&9[  4ú²q©ín  ÞxÝA@”ø úÁßP8ä²íÚäz·„EÃ÷EÃàqÀG€¿Øg®)jæŠÀç^ˆ€ð"^ž@òÏùWÌð¼Ý,m2Ô¾ÅÌP @Ì_öQó°"©×ÍbúË'Êçi;!Wà Dq5D4Aÿy…¿l‹öš‘{0±ÛÕa¸.ÂcPþ¸‘Ôwä¦½í ®º¼>¿LàHo85D½ƒ/„°DÀ3Àpbî?‚ï„!q8ÂpÚ`&ëÔb¶ØĸN†%j1¦7ì3D˜?h îöÿ(÷¶¿`ôû=¹áX+÷„1 +á~jA¬…Í$·]É ÑJ,²Ü–ûTø‚ž‡; ôÃÌ[ƒZl à›?ž™g‘AcuKÔö°«l¦Û›?¬Œèc°ÐÁäN õÑø4bbC›Ž ðoöΦŒ“" ÌSð.ú +þÂõ¼Ÿ'§` +˜_ ›?ÉÕv‡æn&†·!µÓ¼±n†”=àaׂ'C@2ºð›.°€kv€Hè%ÔF‚B¥öHªá~nÈ®ÈÍ„æ¡3_%g~Ô²õÏz´]-è5ÿ…ÿ¬³w{’ÚÔ7L7©=7´·Û•@¦ûH˜djϼóŸAÂ7–Cþw熫ÕbF wóÅX¾Ìs‘»º¸hŒ¨.‡QüˆGvüÆ ÇD…É?…e­Ú¦õ×p?žñ2¢†Ô‚ÔX‹pz§‹Ít´uXìIa¾¶ë4u ­ùp†-‹XKnp®\.MÕežA¿ÿgE­ã©n¶mÐ7°Ž¬@$«ý—Íày®Iƒ´i-€ùAòCþÁUlwi‚?îpð é…£¡ˆ} |>ÔŽ°oØ׺ø‚—ûöüö>ý€ßþ2x Óáã‹0LnÀCᘀ®0¢;~ó‡Áz +? aR`ƒÒ¦Nc¸ê˜d†Ñéï·ÔCèþ¤œÔÂkŒÁÿ³Boxœ§MR MÌñ™&gò„—`2²‚ú¸ß0é¯JØNs†%ðGÜ <Üoà×Å’gHýÃü@)ô_ç´*Žg´Ý# 8ß]ÇðŽ_úÏØHP¶¶jL¢ýÍÿ†AôÜ¢kr?œKë +‰^Üó„céâ9¬µSv1ùCÜâÝ 'œçJp `=¤—ÒEAï¶{i»ájÁ±l˜[\“ÝÂÍ wö§ñvE }ËT ™Ã~khé= ÷ù¤P3¯×À À°Üçz{ØfL [­í‚ÞÂMjÃîF¡ÝDië¨a7Ü‘”^¬+(•° l2änc¸µ,°ÁžnèÝÌïøЯÅÄ@ ãð…|Þ€"4ƒôî »íŒ"ñ¥Õ˜âc^¿—+7õâ}Ðl‹÷A³1Ö˜_Á7å°LFK —W4• Š¤IêOÒÐ&ÿÞ£Žáh±Zì9ÕñFaX2@ÑIiXÛÝ„[çƒ&4à.,oP£¦¤PAbê‚Ônôð' "8~oH¨P‡räjUø{/,Q.|„YW6òï9Þn&'¾T\P´¢âj»¥Pß: zÁP½µpÅ!É¿Æ8Õ5c<°öv'š­“æ‡r<íá°÷„igödfçZÂ0e²-€\Ùqü»ý“¤vp‡‚Öxc¼ZìÀênýß`õÌ€Hâej_>¢W($9]¢D ÃhF:æÅÇ9YÖ!µåëxÛ­5~geuŠ<|´÷|o!Èï“ÀUÿDÒs^~#)Š¡ãÜBôJý°ß!®ñ! ø¨µáfv€©"íŽWVÀh4 1[ü¦"[ÊqÊnÿîö¸w7jsh¹`rŽè&! kµÌTŠ‡ÕŠë!›¹žrš7ùeIq8&3›ÙJkiÁL'MˆG¥ƒBµ"ÉPn )œ_Ð{ŒÇT ÃΈ€Ÿ¶p¡ààö’øGÂ5‘UÂÔ“ß…Õg½§Ù¶É«² âxQÃún8T®¦åȃ÷7‰F¼*m±î†‚A¿JK=E>ˆ¨¯j4@Œ‚wVƒÓ)MòâQ‘[¡ÞË_cÏ‹ µ–˜àSW¦‹m7eÜó÷)Œª-XÝŠÊ‚ÉŠ6yÉÂÄðp³_€ <¤±) +ª&IICwµØzOm—¼?Hh´Þc‰“UA˜OJHD^ ¾aÑ®±¢Ì‘TyÐàÄœó%4Wûxˆ‰@WÓjv ­ö?IÄr²š9ðŸ` ¢~ƒŒåMbñˆÀCI^ö5N•3F\ZPc!Ô<ÐÉta="a¾çt±"«¤02Mßæ‹ñ\®)Ã¥¢¶0¡Ø´ÈÕ’i×ÈaS0»"ƒß+˜¢æ­Ãˆ›âXM¨3„nÄaûñ–šç×àyÞîÅÏ9QøÑ€±Q$ã!²Úv,ç5ÖÀ+\C%¯nŠa6˜Ïœa5»K,z ç eNÊÁ½Åe ‚˜ƒ&eŽ5)›"“ò¨m!-E#jÖ$ n¢6 Ý^FíIŽ-=/U°‡õ \g°„‚£¶@ @«L"¨ä;?‚ΓV£1µÝiµÔZí(,_/Üo )ZmJ…a©­…D­÷ø¸´ãº(¤ØšJz¢£5¦µã=‘[YÓÍÞ=YiHD¦ÑŽšn7ªâ¶£#ʳäf‹Ãý“T³ŠA“Ñš‰j“N»7älˆ•(´ùÛŠ ^Úh@[yÇÈ)ç£uòÌ@»éùØ餵`+r£WÐ?²ð$ÍÂrÚàï[¼ùº'׌¢¤; hGC®é쨩BCVeb±7¹¹2!=¦@ªc…AÇ¡Ø¡Uh¹ÝÕ$jA«M?j19¨;è*¼¯aœŒÖ¡JP³éa3Vã¦àùFC —†› ŸÚ ï£fš^Æx[ZÖWwËmx#G†Üø¦çµõVo|Ú ú4ü½5°q‹QΠÃ&Ú‘”kÄmHŽ×ÿ¨9ÜXËí~®ép3FªÜJÑÒ"GD‡<µ—ž"ðšÌoÇ(ì)ï§g¸7qOÞ…}ÇÆâorÕ ©)9ÞãbƒÛÕdBY%j8&.* gvFU÷B™·j06‹oá[(Ùáè-1.&t22æ5ØNÞzå‰Öê” H¦fXša¶O•¤¤ˆØˆªxC†©;”ÃÓ˜Me±3‡S#È·ó’5ƒ¼°òñž ZF¬C~áQƒ"Ç ¹ öѦÆæ¸çGmæÛ¿Ê‹‰Ü¸Q.ŒóлáQ(%ûÞ Cà +„óE6* +mâínÏ2ÅçÇíÈPgá±ÓpXÏÅ›a»pžì‚‹geZ¹J%Ì“PŽ¡§TýþÑx{°Ä‡]ç£ÿ¾îʦ©Òz›mŒE£ÓjÉ-†nú6ôZ.„̱ôk)ùHÅjŸ–§4u‡‹ßSäΘ ‚ÎÿägNâ6ï»íé„sG§éªÏФã5#ŵzÜggå—Z: [¹ÅCrœw»-³#\µI ç‹w±ð{iŸÿùÊÞ]ÎÌz[£3•Ö~îH†Ì‡b>pû–ýYYÞšü”xÉB» G§áÎËÇg¦sw”±âíb_éIJø•ŽÑîµ#ï¼;­¥É Aô*~ê‡üôë-œ]¥WÝØ4;ßçæáw¯ˆ"ß÷ù±·ö›N¤,o Ði:ןõ·àÓýo¾2©³®ÈÏm¦å2o˜Nt‡“@ý±:Æ…qðÅš›ñDæÎïÈ>;¿éœåµ˜#ödçÑ<ÇÃ%ü´p¦µ9ƒÚKx†ajqû[ô'ÙÕ]Ê⢟‡L­uÿ `KÇçð°œP¼ó•ÎlÆ–µãá)î ¯?á°‡žú3Ô¸âu,c^ä8ÿHwåÂ2üæ'&±EÎ3“ì}z°ºœdvn¬™1ôjwé\%a~+8£AX^¯|„ÌÉpnÛw$:“˜odþBp“›;0¤dÈn†Óòz ½l ©’Ù¥-äb´3©Þ/óSÞ3LÜŽw +¢ Á}5hˆ‘©@_Éb‚ý”x+T™ö9gá›æëù*€ƒ»„#™,8}ùÔìôöˆO~žûh6ùxõlCZeù.| ]ðZš°@¿Ùü‘;OÒ©@è=ô3δó?ŽüÔSý- ‡–ÛlhôúmÜu_3õ\¶‘Ÿ¶¿é߯<Â%èµ AßC“÷ÂÀëèdÝL½˜ÿyä?!O|º¾›sS»Ð0ù7'[a¤õ»®fê5{µ˜·Mª u8Z3K²À~ç~q¤:Ã_fHÉPd˜Ž·÷¦Lûq8œ„¸%¸ÉèRFT ¬ zî¥Þ'w3ßw"•'ŠŸi?âƒÄw¢˜©9}@t‚£ÁIõX+e^Ä7 Ç.þ]´N«î ‘h¿ûl·ýÓ1EB‡f”,Zïw¶Ü<Ô\5wQàW°z[$lZ… dÔ4X]ë{08³-7›èp|üÚÌ„ß}oÒyh”WpS©àrŽ¢rÓ]’Õ@“i?M@Ø$£ùl­·”ë/jŠµ+õÂS°x +>ÂW +<³Ï¾Q´5Vñb>øîs$Kß°_×xZ,äƒálÈUï Ùãö–;N„5ïùÞÙ³?ûÉ:»Út¶™ö¼{ `T<€]Á¹}öï]áLs:·€×¾î³!GmΊN[~j)‡@·sF$:Ý2'цêWÛ_LϺPÞçGù[æõnL‹ÛÝgšíUägåJ é&èˆFh°}$Ù¥u·(&J^+&êß›ö!N [0Ñí%F‡‚õá÷MÐ<’§¡­ûð tl5ˆ|;âz +ä÷ØÌz«Lëû1Ç>f¾Ó‰rÎ š|w€<¨Ýg½ï‡A¦uh„§¨1”ià—ušÇî™)꧗HÕs›p¸:4û4Qµ® àÏ$KT½“ óé±÷ŸºIðÛ0ÿæeÑ ÞtȾYµÎrÜ›?à“-Ú`^b_ç00€h»"h—j‚O?y¦ ÛxÇ¢á;[ယu^ +ë>ÿÆãr’g»Ãô öA@h˜‘"°[¶l‹ù…†Æ…ÐÀ×¥Tâ;-ÅZK°Ôð˜Ñ|¤°×÷õhõš>285~k?Í2ñ‚!é»å™ƒÒÏÄ…hij%?¿§N†d&4>c‰£è*Ûþ#É‘JD¦ð•aÄ>õq'”F£gZИOHö©è+ä 47 +ì¡ÂïÆ>._Žé… 4rôb†‹ˆÁQ5l,KWÄ Ø¨Y +D“¼Ä"äaˆ»ƒ­VfÀIVÁÚM2ëF˜2ñÔ2äƒ ™ö€rK†]™ð5¸pVE¸~ع N%·&Ó ªw™ÁaœÆϾð³g¹³˜M ;`†hhMCì¶Pû„†ÂŒÕò)¶ í™v§º)¦-døS®?¢™ О³Zñû©+ín¨Ör‹p€ëØ3ùeúÍü:Ë-úƒta¼ü½gtfc÷ ew·EoÈÝÞšØãA]ÍÏ\¶c6*¶OAé‰ü1ÂœîX¬ÑÜüÐ|ÏW«¿Y|HÙ™inòõt«O q»J¯½b4äZÄž‰Õ áú.n¥O=&ÛpT;»ÂØÙödCNŸ s-½ÙÑ,OÚ eÁäBÔã!*ІµÎ>#uÌ»Ã- à¿B8º*n§ŒÙv ¯¹¶ž§ægv PÀ–¾_â¼èð\u¡ó¢ÃsáÌAžQ]ppŒc-òûKÁƒ‰¬ÜT™‡×»%k6u³ÈÂH%€ú_çx ›ó¸ÊŸùj6dl£ìKúÞ}¹ûÚ#S™x,yÃ2¤Â]ÄýÉPÕ¯ü„‡å ã‰ÇNAfSwVµv¦þZl–)ãBO”|†¤ÉPÈίƒRvš} ß ܃㮒õ|iyG‚uö’€á1øäÜ—v¦Q4ꈞÅpk +>L +›R¦µJ;Àë³_︙ªûÒ¯Æ(ëζí$ ×2 ð½/͹ù§1z<p,ðåvC)]>9€£Ò˜ø…ƒ~C?»ô=…<ϱÉzEÀ©zyÒ¡l1QøtóPÂÅþ—Ý\,lpyúî¢ëÃ_Î[ÏG$<®=f_é†ÏÖ[?³]=ôî2/Ï­tɹo?~–ÌÛ{"¼<ŒDmç^•è:IIPsËS‚ýÚ¨ž3‹iŠš¿bOo)„!N¤âßÐÌÓh®‚¯ï²ålà%¼ÎWÚ(š‡~&¯ºøíÀ¯{‘a¼µ‚3M™ËE»Í¢ë 8@Îɨ«f±8°çp¬þtbÔߤß^÷±¹£µÚ0úƒØ“ÕG¡Ž²+ÿHÙ¿YN;æc!É4åW²š¾eì eî‘JD1­•ìâ”êËë \ÆÀ[ÜNs zBá×0* +¿9 HÑ î‹(snû½¥\u…šÄ¼ã3”¶^cŸ©ö¼f.ªÏ“üdur,h5w>Eäse3£œ\[cÒÍ ˜hÛÛC0F~ß“,©Ê OvånzÐÖÙ" ƒóù5òUôï>@÷gÆôo¶oåUØœç> ƒC·w€Ñ +ÔA³ÂÈó¾[6H~ ŸUáµ4 ÂoO»–XŸ3Mà ,ô룰XâPöLm…±ƒøÌ¬Ñ +ß"Œ}Àâ÷›Ó‰Ôë}¾²^|dƒ®;óboÌ2Ͷ£×Í]é+œ]z'nÀ0 +æÁ“¯|ÔìÐi¢&@V'ZrÝ´ïo[Åù¾—Ÿ’eW‘[gþÑj³"“Gȼ˜Ý-gDMñémk.ƒ5Ôj“.8ì¡)®ïà|íÙ~ºs»ßó¨k`šgÆоV„Na6Øv»DÏ,F¢òQJ°0x•‹âºO?Óilayy¶ž3SÌ÷Êv¹Á‰ÚMükûñ©Öªc?ãuI“8Ù·-QÜ-ö<‹/ +Îí»ˆÉ 7Ó +¿Jë½ÝÛýðÂ戗Ì4Ð-OsƼI…º¥Üs®“’0»÷A?€IýÛ3þÅÌFá~ƒgd¢ý™ypƒ…Z …Š¿åD~U +2;‘}³1?m}os Ómðw žÙ$+[9FBsy¯¾ï¢OS7Sªéxv‡›ålßÖ4加„NgÂ_“çü4úí)¼“û{ I£?”¥ l~/³×íhb–á­(ôõSè>èVª‚±Jò!ä—ã’è2ShgÂÑ&²'ùé •4#5Øþ–ÍÅ\ækVÌ¥gÍò탷’‰z–ù&ûOºÓ® ‹‰üëËfS:öFÎÒ‘5@¡L4ŸÍŽæ ðRc®w¬Œý'†’(­žÖŽd¸T†úæ÷=Þãgˤf†!þÀ#?÷éδ}À€'C‡¼»9q¥cÏ?KÌrÚ!Sq“c·nøuû›ñÁ­ˆìèCÑXVž9ÙÿæÈMpŠ”ë‡|¹OÓyç¨XHØnï^Gö~³ëz2xÌ4/& Î–ïÈ€Š{­@èî€ ×öä§m +øƒÄt-Å +ýõ]º+«iÊÜßç§[Ê-÷Q Gg6¸9Ô-æ¦)¿°Œ8ÿZ a¾eL¯âm÷gAø‚Ëy¾”¼#Ý 1‘ÛqçæáÆ‹ÖÊä : ŸPZtód¢‰ƒCðùm"¿Ýj‹©ø0–J?™º7ëÞxj™N$wf|QrÖø4ñ`„$hç{(ù(d‚®ê ^4¨êj¿èkË*)S±¶)Œƒ€Úå¶ÉÐË’ ·žŠ`zÌ63µ* Ô¯F”`XQEÌbO?Эí{£®%+â~vn”·'ö`9·7—*¾Öú& +ã̧˻_®±s ½ÃM¥^z…¶9“Ãñðøþˆ¨¡¯ì*œ¾Ež»!‚;aûŠŽfÌ5MPüXñXÅSÙFdW«Ý·ÄÏÇ8 Så£ÂˆHXpûžbdVCîi˜áf‘inkû¼³þ;á ¨åï¶Hß 4÷…±)ô<#U,Dše©ò[nÖ;Ÿ®ïïwÿL$«à Èï‚M8D£bhÄß +ŽºÅhØw©µK>õX½¨‹n9Ô ý-Xm¸.…ÖR^€p-ÿæž Ño¤`Iú=*J(:ᨬ/¶ô`ž= s,ÁÚº\«â`å Z¥ÃÝY!)Ñ{¸‘î*Z]œ÷uMÇÉØýŒºiÃQ'×ȼD:5&Å¢ó‰Œv3LC ñûþ2,#pKħ’’ +â­=ïÁÞà÷˜çÀ(ǯ7ÚÆx«XLϳ·í‰6‡gŒ(½„'ÀCo>`¤$ž2-gÌÍ̾¡AGãÞñ›ò(ôä+nM¶ hªïnû.!"›LÆí˜ohodW.o»Ô}ïnÀÜì³BüiòÜŠß_‡9Ìà° çɵq¶h2ð 'СæÌŒL=®70û¯ÖÌf4£y9'Ù÷­‘VÄò6Dp;À®í {w@Ľ„§,§½eÚ¯á¶@¾è2ýSƒ_¿‰ÂœÒßo@gí:C$žwX Ñ+kI´óö…gœpöªÙLÄYðîp4hÕòv’õ¹ bM¿°±²ãL½Z†û®³¤„OÔ§ÐäG|ø¶ý.®§ðsW,D·‹B¿;²ÇÕ“iÿz­ü°Â¦VüT^´íãÛÂ8d fŸl¶ExSyq ‡]Æ~¶ÀSѸúö½àêEfÙÀ›ß…±À¢ïœeÚyÚú­SÀƒ¶ï+á#ä¡ØàºÅ–ù¯EÏŒ±¹ÿ@­•`ø_róôÄ•¯¬ro3€ð½|š‹Öj6ç¦ñîÜb$EÐC¼ŒX@5Xµ AALŠP¿Cc¢+ ¿œ™MÊØ(~[¿|pQ|æSBè |ÐWêåf(Ö}ÑEÖv ÇÊGˆ¡ýg>ñ8(fþÒ•µŒ…'G¬>‡¬¥6]'ËÔëýî6úZø¸ÎÞ ' úV†1}w?Óž÷°—ÿ')d¢Šsëòè€9õ¢Øj† jG}>¹lz˜øÙÈ™û´òÛ¿6ÌYÃèz¦Ìh«ZwÀ½[Òû7rQIÙ01¥ +J­Ì‰kݦkx-‚Z‰׶IÎô6EÃÍŠ +iÛÂKº*¢Bžãôe®-Ÿ„îÆM­²HQë¶z}Ž¨mV+‰ZÜéÅf©Þ6ÛryÖ:Àò•ëêm}°mk?ÜL†”Z=×´M w;¾Ööœ¤I¼l?' l½¯Í”¥ ÍÉþ ×ÈpƒßGh€¹ö†! 2i¹S݆WÅÀþÙ »xi»1“|‚P3àfÃÅâcˆœ€ŒuˆgØo!ˆ1iX ªý¡a5üžvF¶Z0gMèÃx»WÙäQª†Á¶“½ÛNô ÚpØ,áÕ:nu Á€S‹Ìá²+-ÀW`(î˜#û|1|Yêi»ÙŽçÔvM +Bç(;]¶þç„cÑÔ8Ž9š RR™–ÔðŸ3¨"~íˆ(êUüò‘BU|õt‚JÞ:…žðÕÈ)·x±NT‰ +_V¡K@^yê¨jqæ¨ h àÅ' +eÃRóãÔªuåµ:— : œ¿¶Ô²¦QöªøbV³hJñÕæÙ½ ¯ªüNbB1鱑ÝÆNÑ=»ÈP†*`0sW¡hUÿ©”X!–€ž“0ÖÎC@©zŒŠÍé}Q£îUj(dÆÔv4Ü3wÞêPʬ"®lÆÀÀ@GBbÚXíEV™À’Û“Þö0_Øã'±w4*He^Ö}†Ž†r0ò ~<Æy/W& '‹éBï BöÂÄ7D'Ì¢ÌñÞèqáekø'ù öX™££–Ž½aìâEÉõ˜ËaY"÷ðæÄ“øOòUlŽdð;ìHuFÂãxr9Ró½~ò/1?ÿà…ÿ„Äý©ö>›ŸFK˲¹ù0„û`Iþ©ÏñÐ Í6ùÁèòXàF¸Ñ‘\&Œ¶ç÷¨Ñ9_€gßS·ÑqˆµŒÎ§nÞè"ž|„ç¡gEøƒÆœí%@ûè'лü2ª'ýÙˆ?z­ßQVŠ¡O‰ò€„•|eœ»çÇt5J'#åÄ›»¸}t +Ôç;‘/öÚŇÌÃØkÏ„7,ÿíiƒCÛ,h|0:;ýŠÑqEŒŽ±»Ç¿ŒÎÁ$h´-–+£mŸ]ÀÁÙðÁœMø) zò™AIFË·?ÂàÞmü²ä}–¤)/iåöБ’/e.÷Á×ÒŠ˜Ü÷òÜ@j4EÅéõ¹ŠT O ÅÐU xó®ëO¿X­ÍäÞ‹ˆQ&úÊÙÓn-rp$KÆ{a2ÖÀ¶ÙÚ(aíS_ƒyK‚•M¤ôðüµïY¬ýÐ{C kÙ¼yÞå±&Œ´¹ÓCi˲Ã}y°$c¹G9¬Žø8PÀ2›;ïÏA V„!ôÞ‰b6T—Åj*þDn7þxC+QœŽËŠXï}^Yž2à ô&D©DõäÇZü}õåÚ#8¯íѼZÖ1kÃbAX4ìÔú©ŽgŽ°ÎÄSûA}å; ˆÕvÌP¯ÀÞýê’Ǻ+?Âì1bk虈›•°Ž©~ÄÛ•Çú\°›C‡'+@# ¦Í»lQ k9åÛxßå±l=G|õú,‹ÕT b|j«/Y¬!ó]0L)`í ˆâ¶Ý°Þ :cqéöá¾FÎ_e±–^"ű޻Œnv^ ŸË¢hñ˜à.(mI;iˆØ~4Üò`Í-ÙðNŠµVyþb±ö\VÉXÃA·û]À +9 î{–¨­_ÂòX+¦C¤ÖGd±ÖWdY+@Suÿîœòà |8ˆVí÷ µêï׊ŔQk»²¨Xá܈·žBío%¬y¢Cô£òXk.s{2°Çå°BaÓé?ЊÃíXÉÁN ëñæJe°oé•CXépßí¾"ÖS»–UÀú"¾†ß9¬ÓLϯ‹eìîÙ)Kä~¿;Pĺ%SÖ™Ö'â»PË#¬ˆÓ¤«öÕkêî_*rX)êÙef±Žü6ÉâqDí?ƒuhÚ—¬ÈäHcÔÁŸ# bçÖúƒõ·_è¦ÖJªybÛž“źŒÚ%X簾) +Ðø²=oE,+šDáù£±ºŽåⳋÓ<¹½”…›Áš²œV(¡=tpn™8X å¿åªb¹H:"Ï«çkèÎôÐ+—ÖG£«Ñ—­ÏV47±·d¸?ۇ’Ášz­ÕÄêùg¾EúŽ(7røSß~môÅ6#ÉSAIû÷Fÿd½“=`‹'$•žR€#ž +O“£¨˜Gšúý¨¥ý>ôôXÞ¿§ˆZ3Pzš!j“j=hdäˆ'ã[DéõQWšJOD+·ÜKžb–͇“huÌF…×?ÜD;ýdUz$^¿nù§ #×ÍÁfK­2Ñy5>0OÅ+>}$:3WJéix»fx¢7x&ÞB…œÒë âÝþRzúC|ußí’§Ñ>ÃÄ×ÏÔ©ðúg”è¿ÆýJOÓÄ 4ˆ*<ÀÍV¯Û^ *4Z½Ñoß“ÂÓ‘Ù›½ï•ž¶¼ÕÓ£2ÑÆ[ïóÒ·Px}bóö~ª÷òOƒýM;žØ¿+ÍG7ŒÛ#²µ¬ÀÓ±–E«›ÎÝåt’y*•‚¾ýʘ<þÈ? Ø>Q™oö¢ÔàË‘ˆ¯›ØÓœËÞdB Ý’;ë¤íÈnégF’%vw˜óVø$³œè”øoH$RTÊ{—öì-¹b;î!4ÿ^H¸ÁoD1—us¹¬§ê¯µvìkßw+Ø?ƒCmö[SýqÍøC¯»Õ‡ D=O‘ø™Ýò‡€¨&xÇÖìY<Œl`)š +ÀŠ5D¢›2ù, ç ՟ĶDÌa Îíw ãVk ×UÆj*N<¬P­ñˆ‰b;û¢€ÍõÅÓP ë· +Ö’+*¶&÷÷f+EÇ4Õ/Â)ºóZœÃZZ‰(l²âX­[€F@L¾½nE¬ˆç°øŸòX½Æ‹ˆ¼ö)bE®…"VèWL¬p4"Ĥ2ÖÈóKW+4R) Ð@;e 4Ü—£©5Çœ,~ô‰e÷˜z;$lئq] Ÿ5}íl ¦”ŒGP ‰ãI¢E\<wÞò‘cWÁ°™E†!#g8â +k?íu¾züŸnnXCƒ'íð…õíØ@M,v—lÜoa¡¥ßJã2 +â ÞÝ¡?pJß$Þ‹¡Î÷(½Ë"jÅ!|L±¡©Òk|½¿cÿ »yÁõ@ã¼·ðE—ؘ ;f¬ÓÉÂûÇù´eÄxœpÆø0'¢!Nú¬gNæï Cƒg¦ˆŠz·ø& +}rœÌ–¤^,”ˆ¹¸ á:þ°#D®»ìFa„Œö<$ÿ§‰ûH2sìï'­9ÅvŸq™$ñR†µø™>wQtdÜq"½”9"‚)jl/Ïó¥ÞN¿æbZ™¿ˆ©×ÔÓA}uÒ#[P_‹[u¯ 8!Gznn´é%–Bîí‘ê9w" üøxˆæ„)À”0|§ERÈvxSqyöœ{ű=¢ýaɇBµ2ä+|v¤Ë—ãòË“ñŒd—òVk:ÇÌ >>Ñà\fõÁ1Ȇû>¹³%vòd.5ÖиUÐO¸î™qÉó|¿@ôòM}Hh4ÇS&á ¤3øNøåÙ½T½—ò"N³•÷\ƒ6eÅ GCî_=,ñ Í8@²ÐF´"4EP¸’/@ïîhŽ|¿:F-·úÄèQF¬**:8X€øääÅ“ìÞh<,ú¾Y´Mågƒ÷ +³ +ÿ°Ýg¢ßÇ F(–‡"Pάõ‰q<°¾9ûFLsî…aÖ_ä¬3a†Y¢‰§%ð{4-Ë¥®ôÔ¥H­qui%M%kMŠMIa†KË,O±¦Ò=É“’wxk)ë0ª0“Ã+·E é5jÑëadUïrØA·|Ù÷è£|·x3OÉÖ÷ɬ¦=…Ô¡LI—·ªÖ†YË#À§QÃÖ;a‘L^¯ ÈŽ(fnN†&V0ÚÃEç´©å·{=¢i|§ s³¾_hév2ÑØH³Ù'%Þ­/Ûí+Ê#©å,˜Í¬è÷wV+5[W^g—áîNY]¦áÖ·¬†´4]ky–áLõwÚ¦0›3LñßÆ«µ‹¤í2¹ê¸uÇTF£(!N˜ª¬W#ô„s<Ô;£%4{‚¶ðºßÅdQ¨' CKüÇد¼ÎÚ'iõ'ç<¢­QÎBáqÄF|öì–=ú©y0,èÇ +ˆ-›/zc½Ã"7Ât´É‰„ײ¤œØ +Š@̼)k~ïµgŠW!=÷aV§¾©‚ë<¢Òç¯"G°AHýôR]ìrôBPPú˜^'.v½Ä+ÝÍ©5Ñb_?Š»‚§‹òßÆL&]ÁÕ ÃúQÅ<äâ™Çìæe" +Zí@.RÒ1¯åˆÊúÑŸê´Ÿ‡„f,Äý%. „°Rà él/’TËâ‘[õ¸žhªb¯;H$Ò76ÁÓÂ% +±GIlG…¡Íò! ±™Š5ö3ÛŸz½3JèÏgBªZÚÇó°«žc„˜µR¯^õ°¡ÔJVÒ‹U¤9í©Õa%ïªb½xæºI½>Ø.aw†¡wU©BÔÆÆÙ=öb+BlHÂhô é.p¦(À9­z¤Ï€0ÍûÄ%*+(?3H¬ù4ôBÃYº2ÊÏP›-ئ.ø”¿Y×Ú£ÆVŸrø¡Û:swW©±Æw£ôh@•ð„ÆGiÕ׎(-€¦¾ +õIh¸x¼—†ñáÌÙ¬( +;…Ú€ì'uG~‡r\e\¸es —Žî° 0êºAs_ Vy¢q±ÍvìvvÛoO`Â@“xfg«Ø1Ñ®‘ÎBEjNî}zv²¸(‡Ä—“nÀµ Ú$Ò üÓaÞ™ÑÆŠ†yÑ}½Xº¡¹çIö½št d¤›dqê€v’tS0 `@Û±€ûúökHã„ +eNÓ¤Gœ¨Caò¡ãz$‰vw<Š¾?rØ·ŽŽ—Ž"a2“æPÛSbw á`¸ˆ£ŒÊã– tŠìÒœ1ð›žÉЕѕÏ*ŠÙ:-¶nG¸¼ö<{O@Ó–¸B¬SKèvô&TÈIA +”z;u§[‡™fNœ0¥,l4)þŠP$Ú“tiV…w»Õ7ò5éÍiâ3S×#‚v^[PŽx€ØtqÉ!ÕCSM‡Ï£á{3Na÷íÖÿ§r„`ªëÖšªõ/§•"·Ú™Ö?>¯^Sð*jmhzºŽZ€.×FLñÅÓÅÉI¨;Ê‘=Q¶6 ¯¢~TWŽrÂÆkr®U”cÌŠ²»¥ú1f=ÑÉPH4Ìž|ìù¸€Fj–Ú¡(bVe—Q-OéÊTÚ¾ęF°Ì‚vò:WìZäêá5É+&ZH}6Å»¸ª.˜ÐŽûSnw +»ª1oåŒ=¥>al!Žuj¯397Ηíö\5%IÆЇVtãzjj +Oƒ2M&;NJ‚lw.`Ÿ´ÈÄ1›iέá<éÍÆ‚ ‚jssÒö„¦ÁË'S|Ùžéþ»Cšèˆ3tæôBSXö#Z.ÓCƒs†fþ%ê“r4YºÈ¸¹‘DŒðå1‡ÇÛ²\ÍΪÛKÖç¥Ug8È›'‡B1z›îÛÉFÕò4×)çs¨ÖòÝ`EK•óáZǵ|7ø1—”ó©×òÝ¥‹—•óaXejùðDå‹ÊùÔkùnðÒÅKÊùÔkùÄÔå|êµ|7xéâ%å|êµ|7âÒÅóËùÔkùXµvy9Ÿz-bèk”ó©×ò±£9­œOœ­R€ÇÇø-<-ƒO¹ìWGŸôˆA·´rÅŸ¶ê–;›–—îœxû‘ƾKÄ ËIùë*;…yq@ê RqõmGe>Ç©l"§L­P5åOv§PšV–—Â*VtñéáQ ëÂÔ W™>aùi*ÝÒ +t©ôi'±¡O­ß;AìôáÁfA÷ë{õüÖñБbR¸dƒOd@¡ñ]Þƒû4K'ŸÎ£Yvwj~‰\\–Ýi>RÞ­ÓÒ*»ÓŸ_¢,:mdRLÎòRCë-Ó“à•ù¶³E˜o4 +1õɯ‘ï LÑ]÷:4 LÚ“![ôz$¡‹ê•'Ú`ØÒ§ ETmâX#4‚âˆJ ¦ I¹ FNYÕáåqºêÑ"{-㔚Âþᤂ•šB‘A&W3º°—r©X„#5³µ2ïKj™÷õ&‘֘ö¦P+ó^M¡lRú ^‘BM¡$ê©ÅL’…24 +½c<éŽòüÉÃÔ>ÆàhÊ{çM£þçD¢ù/&Ž3‡eŠ’¨˜,ò]fnY*–)Z–½¾Ò=¹¡Í–?ˆÖ¹WSVÏÊrþ \έpŸÒ(>ìj¾'`ÜŸC I2ç¸H\\~º•È¢U²§0K¸q[>ÚXQqÔËþd×­D +hRDw B1ª®U°w¤ïì8¤€dHÇYªbL­„Àš§¤•º_ôl/Gõ¬ÒKla*04P¦'8l¸9¨Q«§!€”˲Ž’“ζÓ~*Šk_Xó¼Ð$•îu+—â„qÚOå´XJ›xðÁ‘ï©“´kôD}ºá9•íÖIÑ•>¡$‹ëp•Zôæ†?qL_·N‹ÞHÝ(qÜøa/ÞÀ²¨K¢7§­/ŽÞøocÖ[9OO$ltz§Go”ãëÇ‹£7`p«Jʈþz8Ñ›µs P=Ü¥ÑX çÇ‚çæ%=êˆÞ°ëF³VP9z£«:ˆ·l N*RM¼ðH é®ÒK£4V—!]U̹¸9¥B2ö¢1‘ŠžÃqF—?õÖQ̪ãسª¥«˜A¬kp6½\ŠâiòŒZÕ™ ¡UÆ“!ıÎ3Kü´%.ã{j”øé©hU]ÁL!¦JœNOÚ F ¥°©„¡•V²$L‹tCü¦Ìxâ˜öÖÅÙ•yo+λvežzÚõÕ*ó49í:•yLtð¨8ït@ê•y'$Ã^R™‡ÛÐXqÞµ+óŽB½‰‘'Uæ©¥ZqFè*ónð dÖã•*óØÌ{iqÞµ+óææÚ•yÞšÒ¾P©³½Fá?TyùëºS/(¯N«SGê%€æ»†4oéØô’5 ð„Ë×kØÊQò›ÅØÅÖìŽl̺ø…]Œ¸öÄvyNJ±V<àX6ó^WŠ5°Ò“véz,|æÔiÈæêX½‹»åcS‹Ö/úS¡-¿Ò¤C¦)¦B[~u¸ª˜ê9¹l‰“Ù­s¥£Ž ­³pô¸¸ЉëQ^­u®²;ŠÊÙè4ü´ÑIC:$1IÊáQÂüíd·G#®ƒj*žÏ¬—†oW-’}»j‘ìÛ•Šd?¯P$ë5¹®S$ ]§Hº¼HB¹J‘,,£Ó>èZš;¨XFŠÊQ°ºò—Äé9ïãÔ˜ŽÂ>9/A>lwQaŸ\UŸ¢ }~aŸ\‘ _³°O®ª­›ëöɱ¿·v½Â>åp÷U ûäÒS0 }­Â>ÍLÈëöÉíó(ìâ^RØ'žW¦ªOecåÜÂ>…]Ükö©T¬\³°Oï]öaùþ|UŸüöêE…}rʉ‰@]µ°O®OøÖ÷• +ûäªú$]×(ì“›C~Ý\¯°O·Y|ÅÂ>¹ª>¹Š• ûÎ&Úi…}ZD»RaŸ\Uß©DÓQØ'WÕw£PéuAaŸœMz#­ú¾¼°ONö`JúZ…}r›-ŒïyÕÂ>1€{M÷ÌÂ>¹¹VÞX9»°Ÿ%ngFMßœYاà{*RäÌÂ>Œ¼y£\PvnaŸÜn°““”ìUØ­ }D&_ F•Yóšv‡Z¡׉Ÿ +òq7êüê+M¹!19®q‹Ÿ–Éq¥[ü’2WøÉšúH¥y0ƪLRù²<ÍR}}|Y€Ôº³×®oúæÊêW>Á_íÊ=­»zeûtœ2»¥gaëêç…ê6*¤ + l]&ÿmté»LR—é8±I3Sð=%÷ÿY<'„™óltÚë:/ÿã8M} +.¾ü‰rhÝÿ§³¦ïG„_tùf§©Üÿ§¿TJáò¿Sƒg^þ'„”Þÿwb½Ôñå7GžËÝÿwF PØ5ö\‡bR®JñÜõj™$rÍ®K°aÊL‘š­ ¢¦Ž¹ÁMµÍ)`ŧlw˜ã|Õ÷=u sGù(gƼ^õrÇ×ë]îø*)¡8W +t¶'÷ +nº‹îC€¢ž>z + +cÀ:ï†o±©d#– ŠL Å%›ÅÀ&;^à7™Šs‚÷gÜû'›™‚_ýwæzÄ@]ñ®o­{ÿtšê—ÞûÇ™êŠWÿXú£pïß©.î™÷þɨ5ñÕ—Œë(fsÚe}RhÚ÷þIĪվgÝû§ûøöÒçïÅõe€Õ§qò†þj_¯IÖµäú´j_¯é´ûååƒ)椎ºÍBL®ô^ðΤ+ø¥‘Ñ…]Ví‹ 0Úóòjß7Õ³íÒH{žR}”µ£ëA‘e#­¥:ÎÚed¯êM6 &—gF¯²O,¤ê¢½*eµ&_K¥V-7RŽö±œ¦ÛÁÐæ:r¥Þ½ÂòЖ:–§ŽBª.rñ¯ä{(u?ÿÈ÷TPR1«[%cRÓb”†@·Tk©NµGÌÆ­ øùÇÏÁB¹ v¼x÷ŒºÛœ[9•O +7’3ïU*Ó.9Uë˜hW» sD [¹Š»Qz-›œ;¬CÞè¼@°;ÐQªânº§ïj—a‚>©ž2¢»îVXÆÉàÓF!; 5š¢|{XÅ >F{°Ô° ÿ¤Ž±û–æP¡Û_‹ÞòÓw/!ûIT#GÑÞ;JÀŠZ|5É‹ÊWæ%L÷Š•yÔáÛ­\Ñ$|3éM|áj:™[ùjµwµ*įĿ‘"NŸ[ŠXc±Ö‰b@CGž³-l¸â9Ú<'•*ó"åäïíš«¤2φÕÞð·ÇaD~ð)b%ŠQâYkÈ|Û\ûúrX8\•òGS‘(c-9¿;ŠX-¤5<Ç]Ò’@·ÖšE+E¿&rX¦1ýåj‹¦–ŒrøÑ'v2l¹÷ÉZO»þa½ …¦!óo¿Ð­k‚ ÎYîc',ÑùÌHÌQ,ɺ>ŠÀ”²Îâ5ŸŽìLÖa—ÙQúÈ_åÚ…òš7À` —ê¤:%qK«<ήè€V§” z#9ƒXW˜¦œ5G¨™¯·ØäêëF Fºk§éë–ò=§®›¸r-Ûã<\±.s¸'sÚ5<‚ú9»z#·=çþ’X˜˜h…ÏŽzŠÞMðÂu¶‰z.óâi…kB ë¹e|£t°™¾’D½AP6¤ªX’¨q©¾zDýukZ^MA5L_³$Q¯Ùˆ×ßœQ’(^žÊõˆ72ÇœP’(î„r=âä>éKõÖ#rŠ@ÑGR‚qÚEƒr{k'”$*ˆ½£zD9‡ý„’DmU£”ýpRI¢Iê%Ô©%‰ºÜCéöªxH'U.iÔ#*{ÒõWùquY!.þÅË +q7ꨶñz—j…®tY¡ ´åÇ—JeÚ¿tY!R=÷b@½—òa»÷²BÄi°[ÿîe…xæý¿xY¡|øv‹”½vÙÕLw´NµÂo;äÓà.½ðcUùÛOͶS¼ððœS­Î¸ðPqp×8ÕJ¸ðð¢(ýªÞ\áT+tááNµÒs᡾zÏ‹/<$ôcè³.5:¨xáá鵸g]x( …Åê+'\xx~F—Ì…‡ç–êß°’_x(ZG·2h®pá!WU'Û!+Ó.¿ðP=‰Š1n¯p᡺wÏíj…Wò·žëMzááù¾çI*ÉCæ¶Ãk¥(æÔo;¼‘­ö…‡ê·²&ÇåªéÊ+é3.3ÚïïºÛH|•½k´J÷óåÉõ<[Í«ñ]%½¯~ºù„+J4œ»Àó7šTÐ3ÅvûŽ¸%'àçÆVVœ°sƒJ^i¸ÖŒ®l/€]ÉÞ°ËJè…ˆ‰Vz‰E¿Äw¢o£¨g—CîÑX¶®#á·¤‰b¶š%ŠÓñ#Qª?¯is?4‚Å´Faò·àxˆ<žâÀxÃTH¾…Nx€î?$u~‘ûOx–&7zÝ]ï Âêö ¯PBZÙO?¤¼Q¶1§–_³nÊö—˜Õ¿ºØ¯µ ȃ}a¼üž`…Ȭ·5:S}{ûò`eû™ Û„h ܃ˆ{6¼Í=pÏr.á/ûþšâT<Â`“Í2܃º—Гv·"<¥;ú ¢?ãØK9§ÐG]ª¸Ív Û>Ùæû¢àAÓ‹¾úS¯F𵑶óÈvD,Ð(:a+;0ÁÉ,,P.F€l­E€pªƒùmÔ=0"íDº|}EpíÌy~ÏSkéï¶ýÍ 3|êÜkÂÓ«¹p¢}sh¾Áì‡Þ]yÏ0q›m,¯ÅD!ðƒÉOFº–º/¸w˹¸œ6®E9ùùA,p œˆE]´=F^¢‘R1m!ÛùÊäÁÈùž`h]/ÇÆmŸ#ï¼;­åJÅg[ Ì,“õ†~èCœÉFu¤’Ð5¼__=,÷º„wT«ØÐÜŒ>¼ŒEìõ}ÉhÅ·Ÿ†~îÓ$€`°ó»l".¤ÑÁ×®‡}wùApŸúÏ€F­%…幜ø±g}£PØ>ª¾ï§ß;v4Ëu‰6âÄɾmš›‡Šõì*bŽ`adñ°BŠ˜{d+ó…‰r>³ïºy¬c–eö}Â[ò¦­àÓÐË}šø„v@g7Á÷?IwàhæÁ}§h·%ãáŽËôTü~º‹"Eë¿Ðaâ±ä‚ùú +9 +n9Síf ε˜$?MÊB÷4Û¿Š¨VºðBæo]£íùÝÊ +ÑC ÝÊ\‚5Õ6Ú«¤Ñµyù„‚5*w´¿ãáyè1’,žŒ­=Öyò“m2ü…¯G2 ½¬nðu°ç´l鶿Pt:XÑ ïr‹ÎÞÖ [|–´ñ Í>4)èÀ!à™&*žEwïf‚_ gÌ i Ó +raªó\=føì  SG¢- e¹NWH~C Ž¦êq$Ãrî{™™ˆDl ‚£* bT½p4üRô–²¿!0A³:xölçGhcªß‚•ù ÞüƈS$D÷“]™6EoÙUôB^24Ë©&z/vIà›ñ/m›|Ø –0̤)–ƒïÈÚKͱ¯ÆS4S…`®:ø7‘Í~?›ŸÑ/±ûm>–7“ÎJá-K6ÓÓ¶÷<õµŠQs0YŒÞ6'¹¯Gs9~˜ƒß :`ÛKœiµL eå>ðÜÂÉu3ÁûûµHòÝÞ¦c…ßϘ?—dÚ¹þg¡ÜXxÓ¿O&_Y/èb~åͲ&D ¿àÌ;ú™=d3HX¬7 Ì,âc¬fºàX¼Ï3íÎ'£Ô2Ó:çáßr³V-îÂûÄ4GË  ‰˜…w·ýÊAÃ#:Œ^}ÌǨß|y·;ñV쿼éø㲩>`&-Œ9jr$÷F‰£ˆ óÁe÷¸fÏ£(hñ +ò+dŽÕš€àä"»´Z_Ô&¹êTóî°…F“Y@粿DÎA¢iùb9ÇX6ZcV0`·Ý-ZP(Ô’|Ø r¨™àýµfš‰l\‘•dÍ!µv¡”×±æ šK¥¼µ~§ šýtÔŒSx}SFZ»È”‘¥5»õ­MîS|ÌnŒ¾Ñ5ðKF Ãv2KìBN;²âš³E +´ Ýj¡Ä}:yQ8àÉ¡3ó²F§¯øÌ|µÙ³>£ë³Ð‚^` :€UðÀEÁZ‹‰±&N£+âê‹B6N1ž!ïM NcÃlæ„2ö4²§ Ò¸˜¾¶ÛAÐùM¶ÞHóÁàw¦ÿ±æ+¡G0#VS:‘*ºù@ò¯0 žùÝ–cÃ|›¨tàúQwÈt§úPóÐ6¾Cõ¹œy…’“$6Æûù\¬¾ñÀžŽÎywó›ÊM6#½– Ä*±,N6ªP0å“R§tGR@Ÿ>×mTÉœÙú>›æzG}¡Z;É€RЬ—áQ·W1*ÔQÓ݈Ӆíuv£½¿ÚñΛU ýùnÔI<ô´ gj9•XœÃîÛßã+횈cF=üè2™ð¢3ßôA%Ë»5ôÍ*P4:“Gø atþîÞ˜mÇ‹)5JÝhûžFØpä`âgÎwý·ô͹¢È^ÆT¿¾O«Sß\Šº0ü.,Ó›_Ï7Àß„Gè m·Îÿ»úæTUÇØZcV06Û¼zà†Ë~¸bàŠø†DÕqœv¢ÉOïwfh\ƹ¡sùrÆÕE–•x‘A8eÉél&äùa3}¨‘esÂ:;s‘±ip×,j2í“RÇ€qNÓ³ÎÎ5@sÒ:;sè8§éYg:ÜÛëü +A!:Èe¿¢7sY7á+¼e{ÏçŽHgÆ/ÏÅ|Ê|Ì8·1Kþ½¸ÿÊ”CßÏéi{/P_£z<åíDòæÉ¡OÙ þb;î ÁBhŠã…— ­=€æÚz9CzÒWŽh覜¸9#Z™µœÄý÷=ida³ÞÚ5#rCÇÓyþ'‡s²š3×FnÏÞ28¶µÏˆ§ÊãQÄËwöqWÃÓøW#·Š.ž8žæ½ žf½ýpÃØY~mœäËÈ-wNIKW¼×Bîsóð©s±ÿ:ØtÄàܱ¼˜”&1ÏRÕ»âRMûg¦ýúÓ×%çÐ'>w0V`[¤ò˜¤Õ•¦8X®ìÅÌjø£ÏBŸ G‘6¦È›ZÁENOå9‹5·0~Ø4ƒ)§3œ?¹ì÷•8Ê´ðe»Ã½ ›Iíý7gŸÛü—gM=¼ÿ×fM=@ó/Ïþ ÛD—Ì>šz>£ë_›ýSv +/˜}4õŒ°ù7gM8 +ÿ«³¯Ï¸U}ÆðÚŽ“³p ͤŽ³D³ŠÆàÞâ …ê¸ùc°–E5GõuØ’ëU˜”ô4¦¸ïƒÛ"† ýfÊeLü^UGtKÀ&€ÚóÞ¹(H`8r·©‚` ú¬Ñž_úÍdJ¦Jœ»µãã‡o*ï(ÏÆôH`t» caÅŠ* ‚¥`e2û +Ÿq—ÿ>þážYÞé-õÝL%#ú ÌaÇ~ƒÔ=€ÙvŸ4—8ØK=(4Bxñ¿Ñ—ÀŽø¸þ3éM’‹„Üàt›OpnO¿Ù‡ØHüê¶YS_ «xàó·cÃÍÍÁ(äöôÇ=· Æ„Ó©CïŒ8]r¢‰8[ÇŒøÓ/V+ `˜ªKƒÎKYËI(à\\m^ÔT\éŒeãôq0BfaѦR5'Âå± ín7þxƒ»†oí·“r‰§©Ës†’ršG–QN`w,— ‡]÷Ú÷œË%§yˆK¢,€tsšÇwI'Nóøµ—]9ðð”s00¨dÐ/ê„OCqúF>ç¥p‰•ô93âsë` €FmF|zL9!Æ .WÒ>¯ø«Xøü‚Ç$'¥iÂ|pJŠ¥‹íTì½@õÝï™r蹜ΠKŠ†˜Òkþ +L..ófe|Q™O¡K°•FurÖÂu—.ß úL-FÁ6Ü°Ðú +¾¬·| 20ïiòÝ ï Ûú«Á¼>84Yà߶.Ï_ïxYíw|òÃ? úMv4#l4ßoÆÊjfWî™=ÓOkùjÅØb1°bÚŠŽáÏòºÇá¶'²þ»C…„å +,â/³ºï}¯¦Jý>þd?å‡ ¾Ÿm×Yg¤Ý©çÚ_ÅüÊ4Î4ÛŸ–ÂÈ•~ƒâ)ÁD9æ\Ùî~bBL<­8Š™ž{6ŽÂ,ž§ ûZ´3„´<´ì¨>ä"ñc·ïéO½†ŒL!‡8-e+SJÒK¨ÖÊv¶|Þkòøò®¶|E© Î~˹ái ]žUmèhäI‹ùÊ‚‚«Ä†çŒq‡ždÀ ++/ÝÄÄjqž14+Å“Ôc¯³æ€YÕÅ +,Oþ1±%@û¢¯¹.WL§DtÁÄ( ¿ÜìKi\‚OpF¬„.]ÌÜŒVB—j®äJ-ˆH-¸ º\,/eþ0[‘hÀ y}Oó°"©:µ˜-6çÍñ›?<™Š×ûº™l‹I¶É¿÷ùíø°&7{CÌàÉ´r•J$˜'ÇÛ _€sþæeŸ‹å6c?BE”Jˆø0›ŸFK˲¹ù0ÌO‰^RšhhÙµas™Ýƒ»ƒ¹ƒp®e´–i'üÚcb;LøTr ³ÈP4×nΓTöPp<ÕÞ$K™Ñïvéæ bV=K *­ü{>5§¼wÖ¶¾oå¾*«|áãÛ1DEÂÇÇÀÔ¢JÆJ³áh$ÕÙV×Ðw +áŸ8<Ø¢atyîû2ÕÙw’`!AîÓŸŽe@Ò +&Ê 7¼]2BÉòÐcf¶;@ÝÅ®–à' ¿ò:Öi³Ÿ¬L!=XŒvñbDkÓɧ/Lsn´xÝü›¶¸ýííÓŸêì²Ü2 +X±/Äë +ÃÆìd¢Á¶€GpÏðEæû:ôÓB96¶ú0ü¥²{l8j°ÜÄ'^`ØÁ²H‹n“d#çJuŠ3{ +EéÕ‡ +ãñCÀê†çV°•åŠKðƒàAJÌ’iÔÜÌé–‡.°'M®t/ø3_» \°n6̹$>Û­ÛÆ4›ü Ž^ÝÍ¡9í i ½pJB¯é‘ƒ“1ÎùJ`;N¯±\æõ>þ›‡«»L;³ycŽÂÈ~Øû(ó Y +ã.¯àÚ~žÉ¾ñI՜؉Ì£¦›9ì¢ð™·1Ÿ†¦s† ¦P–Ä»¿ŒR¡Ñqè;¿£Y­Ö4Z¾ºa¸Û f.bAø³\øá(Ë¡;ÕÚÿ7‰³§ÌÞƒühF\þI'”ðJŒSqXN{-3åþüÐóŒùTø|t0Ÿ°žïg~ô›/Ûs$Ý ½¯Ë«üôŽ†~P:‘ꘓ,€Ý ­Ò‹•5Hw÷Èþ Ì~J &~X”Ïi‡%x!šb»pþîêò‡ñÇÉØ1\ü@¯)s¦Ø&úM™3íÄÐ'˜2gÚ1ÜÞµ^SæL;† ˆ©A…‹˜£óJ}øÄ ,ˆüöÏ?(Ëm+Þžó/ܶ"ålMRT"Õ‚DåÓ阳%/æžÉ•¢_evQÍø6ì»ïQ²…Jõ¿ ûr à`–lÖïËø ´,Èl@º0Þ³/Y°ì€ŸÜüoþ707Î<òÆJ1au¿§ÎŸyAÒÌ‘e_ØÉd‰øºÉï^ö˜ÔnãNº{ WÜ%»—èŒuŽh'oÜA:H7%ÔãhL_J üòtèãt@›Ê,Þq"€îàD€g숉À14N‡aâY ƒÿcå`‰`yºOßÊæ3XôìG¨1Cú ¸…Ëf³b»ÙòÌPj õ©ÄPʘD™ÖæèŒXuLºœ:ŒÞNÇÊPÀX~É@”êËžæyÙ@ÐÙ¬èÕ^+yCÌÀ6¬ 7Ä´¿ÛÐöéöqpóaÈÀ?Ý¿àß&üC°øá]ôÐËþÖýöñ|ú1n_Ðð—ÁKž _„arÞ(áŽúÂaƒ?t ë›?a¿Ûòr¿Ônþh)uí#ðÿÎÝ ˆ)f˜ÁÌ06Õ34´4„Šc†‰ž9ÈVSK¨ƦÆz–&0"Ì011Ó3‡‡!Ô D’ê#˜;,-‘Eˆ0ÃÇ šâ€ œÞtA¥°j@bzjHQbf(¦'–¥*$æåå—$–¤¥Ò‹R‹Kò‹RŠ3òËA" Mp ÀäìïÆËM˜Ù– +endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 22 0 obj [21 0 R] endobj 35 0 obj <> endobj xref +0 36 +0000000004 65535 f +0000000016 00000 n +0000000159 00000 n +0000009448 00000 n +0000000000 00000 f +0000039045 00000 n +0000000000 00000 f +0000009499 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000039112 00000 n +0000039143 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000010825 00000 n +0000039228 00000 n +0000009835 00000 n +0000011122 00000 n +0000011009 00000 n +0000010082 00000 n +0000010263 00000 n +0000010311 00000 n +0000010893 00000 n +0000010924 00000 n +0000011196 00000 n +0000011370 00000 n +0000012385 00000 n +0000014612 00000 n +0000039253 00000 n +trailer +<<716E2DB4294F6749B3E5ADF7E13AF65C>]>> +startxref +39388 +%%EOF diff --git a/web/logo.png b/web/logo.png new file mode 100644 index 0000000..4bd3326 Binary files /dev/null and b/web/logo.png differ diff --git a/web/package.json b/web/package.json deleted file mode 100644 index 6589ead..0000000 --- a/web/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "stairs", - "version": "1.0.0", - "description": "Stairs lighting project", - "main": "app.js", - "author": "Mark van Renswoude", - "license": "ISC", - "dependencies": { - "buffer-reader": "^0.1.0", - "express": "^4.15.2", - "md5-file": "^3.1.1", - "semver-utils": "^1.1.1" - }, - "devDependencies": { - "@types/crossroads": "0.0.29", - "@types/hasher": "0.0.29", - "@types/jquery": "^2.0.41", - "@types/knockout": "^3.4.40", - "@types/nprogress": "0.0.29", - "@types/requirejs": "^2.1.29", - "gulp": "^3.9.1", - "gulp-clean-css": "^3.0.4", - "gulp-concat": "^2.6.1", - "gulp-debounced-watch": "^1.0.4", - "gulp-plumber": "^1.1.0", - "gulp-sass": "^3.1.0", - "gulp-typescript": "^3.1.6", - "gulp-uglify": "^2.1.2", - "typescript": "^2.2.2" - } -} diff --git a/web/protocol.js b/web/protocol.js deleted file mode 100644 index d29744a..0000000 --- a/web/protocol.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = -{ - Command: - { - Error: 0x00, - Ping: 0x01, - Reply: 0x02, - GetMode: 0x03, - SetMode: 0x04, - GetRange: 0x05, - SetRange: 0x06, - UpdateFirmware: 0xFF - }, - - - Mode: - { - Static: 0x01, - Custom: 0x02, - Alternate: 0x03, - Slide: 0x04 - //ADC: 0x05 - } -}; \ No newline at end of file diff --git a/web/site.scss b/web/site.scss new file mode 100644 index 0000000..8a63343 --- /dev/null +++ b/web/site.scss @@ -0,0 +1,222 @@ +$color-primary: #0066ff; +$color-quaternary: #404040; + +@import "milligram"; + + + +$bodyBackgroundColor: black; +$textColor: white; + +$containerBackgroundColor: #202020; +$containerShadow: 0 0 50px #fcf6cf; + +$buttonBorderColor: #404040; + +$sliderBarColor: #404040; +$sliderBarSize: .5rem; +$sliderThumbColor: #fcf6cf; +$sliderThumbSize: 2rem; + + +$smallScreen: "screen and (min-width: 768px)"; + + +[v-cloak] +{ + display: none; +} + +body +{ + background-color: $bodyBackgroundColor; + color: $textColor; + font-family: 'Verdana', 'Arial', sans-serif; + font-size: 10pt; + + padding-bottom: 3rem; + + @media #{$smallScreen} + { + padding-top: 3rem; + } +} + + +input, textarea +{ + color: $textColor; +} + + +#container +{ + background-color: $containerBackgroundColor; + margin-top: 2rem; + padding: 1rem; + + box-shadow: $containerShadow; + border: solid 1px black; + + @media #{$smallScreen} + { + width: 768px; + margin-left: auto; + margin-right: auto; + } +} + + +.header +{ + position: relative; + + img + { + float: left; + margin-right: 1rem; + } + + .wifistatus + { + position: absolute; + right: 0; + top: 0; + + .indicator + { + display: inline-block; + width: 1rem; + height: 1rem; + border-radius: 50%; + margin-right: 0.5rem; + + &[data-status=connected] { background-color: #339966; } + &[data-status=disconnected] { border: solid 1px #808080; } + &[data-status=connecting] { background-color: #ff9933; } + &[data-status=error] { background-color: #cc0000; } + } + } +} + +h1 +{ + font-size: 16pt; + margin: 0; +} + +h2 +{ + color: #c0c0c0; + font-size: 10pt; + margin: 0; +} + +h3 +{ + color: #808080; + background-color: #282828; + font-size: 14pt; + border-bottom: solid 1px #808080; +} + + +.version +{ + color: #808080; + font-size: 8pt; + text-align: center; + margin-top: 2rem; +} + + +.tabs +{ + clear: both; + margin-top: 3rem; + + .button + { + background-color: $buttonBorderColor; + color: $textColor !important; + border-color: #808080; + + &.button-outline + { + background-color: transparent; + } + } +} + + +input[disabled] +{ + cursor: not-allowed; + color: #808080; + background-color: #262626; +} + + +.label-inline +{ + margin-right: 2rem; +} + + +.hint +{ + display: block; + font-size: 8pt; + color: #808080; + margin-bottom: 1.5rem; +} + + +.loading +{ + margin-top: 3rem; + text-align: center; +} + + +.suboptions +{ + margin-left: 5rem; +} + + +.buttons +{ + text-align: center; +} + + +.slider +{ + -webkit-appearance: none; + width: 100%; + height: $sliderBarSize; + border-radius: $sliderBarSize / 2; + background: $sliderBarColor; + outline: none; + + &::-webkit-slider-thumb + { + -webkit-appearance: none; + appearance: none; + width: $sliderThumbSize; + height: $sliderThumbSize; + border-radius: 50%; + background: $sliderThumbColor; + cursor: pointer; + } + + &::-moz-range-thumb + { + width: $sliderThumbSize; + height: $sliderThumbSize; + border-radius: 50%; + background: $sliderThumbColor; + cursor: pointer; + } +} \ No newline at end of file diff --git a/web/static/assets/dist/appstart.js b/web/static/assets/dist/appstart.js deleted file mode 100644 index 3d64687..0000000 --- a/web/static/assets/dist/appstart.js +++ /dev/null @@ -1 +0,0 @@ -var bowerBase="../../bower_components/",config={baseUrl:"assets/dist/",shim:{bootstrap:{deps:["jquery","tether"],exports:"Bootstrap"}},paths:{crossroads:bowerBase+"crossroads/dist/crossroads.min",hasher:bowerBase+"hasher/dist/js/hasher.min",jquery:bowerBase+"jquery/dist/jquery.min",knockout:bowerBase+"knockout/dist/knockout",signals:bowerBase+"js-signals/dist/signals.min",text:bowerBase+"text/text",bootstrap:bowerBase+"bootstrap/dist/js/bootstrap.min",tether:bowerBase+"tether/dist/js/tether.min",nprogress:bowerBase+"nprogress/nprogress"}};config.wrapShim=!0,requirejs.config(config),window.Tether=require(["tether"],function(){require(["bootstrap","index"])}); \ No newline at end of file diff --git a/web/static/assets/dist/bundle.css b/web/static/assets/dist/bundle.css deleted file mode 100644 index eeec680..0000000 --- a/web/static/assets/dist/bundle.css +++ /dev/null @@ -1 +0,0 @@ -body{background-color:#fff}#page{margin-top:16px}.row .header{font-weight:700;padding-bottom:8px} \ No newline at end of file diff --git a/web/static/assets/dist/components/page-firmware.html b/web/static/assets/dist/components/page-firmware.html deleted file mode 100644 index 53a9482..0000000 --- a/web/static/assets/dist/components/page-firmware.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
-
- -
-
-
diff --git a/web/static/assets/dist/components/page-firmware.js b/web/static/assets/dist/components/page-firmware.js deleted file mode 100644 index da58b54..0000000 --- a/web/static/assets/dist/components/page-firmware.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports","text!./page-firmware.html","knockout"],function(t,e,o,r){"use strict";return{viewModel:function(){function t(){this.Host=r.observable(location.hostname),this.Port=r.observable(location.port),this.Path=r.observable("/updateFirmware"),this.updateFirmware=function(){}}return t}(),template:o}}); \ No newline at end of file diff --git a/web/static/assets/dist/components/page-home.html b/web/static/assets/dist/components/page-home.html deleted file mode 100644 index 6769dd6..0000000 --- a/web/static/assets/dist/components/page-home.html +++ /dev/null @@ -1 +0,0 @@ -Hello world! \ No newline at end of file diff --git a/web/static/assets/dist/components/page-home.js b/web/static/assets/dist/components/page-home.js deleted file mode 100644 index 1110264..0000000 --- a/web/static/assets/dist/components/page-home.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports","text!./page-home.html"],function(e,t,n){"use strict";return{viewModel:function(){function e(){}return e.prototype.dispose=function(){},e}(),template:n}}); \ No newline at end of file diff --git a/web/static/assets/dist/components/page-mode.html b/web/static/assets/dist/components/page-mode.html deleted file mode 100644 index 0cab795..0000000 --- a/web/static/assets/dist/components/page-mode.html +++ /dev/null @@ -1,71 +0,0 @@ -
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
Brightness
-
-
-
-
- -
- -
-
-
Step
-
Value
-
- -
-
-
-
-
-
-
-
-
- -
-
-
Interval
-
-
-
- -
-
Brightness
-
-
-
-
- - \ No newline at end of file diff --git a/web/static/assets/dist/components/page-mode.js b/web/static/assets/dist/components/page-mode.js deleted file mode 100644 index b1432cf..0000000 --- a/web/static/assets/dist/components/page-mode.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports","text!./page-mode.html","stairs"],function(t,e,i,r){"use strict";return{viewModel:function(){function t(){this.StairsMode=r.StairsMode,this.Stairs=r.Stairs.instance()}return t}(),template:i}}); \ No newline at end of file diff --git a/web/static/assets/dist/components/page-settings.html b/web/static/assets/dist/components/page-settings.html deleted file mode 100644 index 65c8535..0000000 --- a/web/static/assets/dist/components/page-settings.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
- -
- -
-
Step
-
Start (min. 0)
-
End (max. 4095)
-
- -
-
-
-
-
-
-
- - -
\ No newline at end of file diff --git a/web/static/assets/dist/components/page-settings.js b/web/static/assets/dist/components/page-settings.js deleted file mode 100644 index 29a58c1..0000000 --- a/web/static/assets/dist/components/page-settings.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports","text!./page-settings.html","stairs"],function(t,e,n,r){"use strict";return{viewModel:function(){function t(){var t=this;this.Stairs=r.Stairs.instance(),this.resetRanges=function(){return t.Stairs.Range.Values(t.Stairs.Range.Values().map(function(t){var e=new r.StairsRangeValue;return e.Start(0),e.End(4095),e})),!1}}return t}(),template:n}}); \ No newline at end of file diff --git a/web/static/assets/dist/debug.js b/web/static/assets/dist/debug.js deleted file mode 100644 index 9673267..0000000 --- a/web/static/assets/dist/debug.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports"],function(e,n){"use strict";n.__esModule=!0;var u=function(){function e(){}return e}();n.Debug=u}); \ No newline at end of file diff --git a/web/static/assets/dist/font-awesome/HELP-US-OUT.txt b/web/static/assets/dist/font-awesome/HELP-US-OUT.txt deleted file mode 100644 index 83d083d..0000000 --- a/web/static/assets/dist/font-awesome/HELP-US-OUT.txt +++ /dev/null @@ -1,7 +0,0 @@ -I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, -Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, -comprehensive icon sets or copy and paste your own. - -Please. Check it out. - --Dave Gandy diff --git a/web/static/assets/dist/font-awesome/css/font-awesome.css b/web/static/assets/dist/font-awesome/css/font-awesome.css deleted file mode 100644 index ee906a8..0000000 --- a/web/static/assets/dist/font-awesome/css/font-awesome.css +++ /dev/null @@ -1,2337 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; -} -.fa { - display: inline-block; - font: normal normal normal 14px/1 FontAwesome; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/* makes the font 33% larger relative to the icon container */ -.fa-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.fa-2x { - font-size: 2em; -} -.fa-3x { - font-size: 3em; -} -.fa-4x { - font-size: 4em; -} -.fa-5x { - font-size: 5em; -} -.fa-fw { - width: 1.28571429em; - text-align: center; -} -.fa-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.fa-ul > li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.14285714em; - width: 2.14285714em; - top: 0.14285714em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.85714286em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eeeeee; - border-radius: .1em; -} -.fa-pull-left { - float: left; -} -.fa-pull-right { - float: right; -} -.fa.fa-pull-left { - margin-right: .3em; -} -.fa.fa-pull-right { - margin-left: .3em; -} -/* Deprecated as of 4.4.0 */ -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.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(359deg); - transform: rotate(359deg); - } -} -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - -ms-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); - -ms-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 { - filter: none; -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #ffffff; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-remove:before, -.fa-close:before, -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video-camera:before { - content: "\f03d"; -} -.fa-photo:before, -.fa-image:before, -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before, -.fa-bar-chart:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook-f:before, -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-feed:before, -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-navicon:before, -.fa-reorder:before, -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-desc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-asc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell-o:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-mail-reply-all:before, -.fa-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before, -.fa-gratipay:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} -.fa-space-shuttle:before { - content: "\f197"; -} -.fa-slack:before { - content: "\f198"; -} -.fa-envelope-square:before { - content: "\f199"; -} -.fa-wordpress:before { - content: "\f19a"; -} -.fa-openid:before { - content: "\f19b"; -} -.fa-institution:before, -.fa-bank:before, -.fa-university:before { - content: "\f19c"; -} -.fa-mortar-board:before, -.fa-graduation-cap:before { - content: "\f19d"; -} -.fa-yahoo:before { - content: "\f19e"; -} -.fa-google:before { - content: "\f1a0"; -} -.fa-reddit:before { - content: "\f1a1"; -} -.fa-reddit-square:before { - content: "\f1a2"; -} -.fa-stumbleupon-circle:before { - content: "\f1a3"; -} -.fa-stumbleupon:before { - content: "\f1a4"; -} -.fa-delicious:before { - content: "\f1a5"; -} -.fa-digg:before { - content: "\f1a6"; -} -.fa-pied-piper-pp:before { - content: "\f1a7"; -} -.fa-pied-piper-alt:before { - content: "\f1a8"; -} -.fa-drupal:before { - content: "\f1a9"; -} -.fa-joomla:before { - content: "\f1aa"; -} -.fa-language:before { - content: "\f1ab"; -} -.fa-fax:before { - content: "\f1ac"; -} -.fa-building:before { - content: "\f1ad"; -} -.fa-child:before { - content: "\f1ae"; -} -.fa-paw:before { - content: "\f1b0"; -} -.fa-spoon:before { - content: "\f1b1"; -} -.fa-cube:before { - content: "\f1b2"; -} -.fa-cubes:before { - content: "\f1b3"; -} -.fa-behance:before { - content: "\f1b4"; -} -.fa-behance-square:before { - content: "\f1b5"; -} -.fa-steam:before { - content: "\f1b6"; -} -.fa-steam-square:before { - content: "\f1b7"; -} -.fa-recycle:before { - content: "\f1b8"; -} -.fa-automobile:before, -.fa-car:before { - content: "\f1b9"; -} -.fa-cab:before, -.fa-taxi:before { - content: "\f1ba"; -} -.fa-tree:before { - content: "\f1bb"; -} -.fa-spotify:before { - content: "\f1bc"; -} -.fa-deviantart:before { - content: "\f1bd"; -} -.fa-soundcloud:before { - content: "\f1be"; -} -.fa-database:before { - content: "\f1c0"; -} -.fa-file-pdf-o:before { - content: "\f1c1"; -} -.fa-file-word-o:before { - content: "\f1c2"; -} -.fa-file-excel-o:before { - content: "\f1c3"; -} -.fa-file-powerpoint-o:before { - content: "\f1c4"; -} -.fa-file-photo-o:before, -.fa-file-picture-o:before, -.fa-file-image-o:before { - content: "\f1c5"; -} -.fa-file-zip-o:before, -.fa-file-archive-o:before { - content: "\f1c6"; -} -.fa-file-sound-o:before, -.fa-file-audio-o:before { - content: "\f1c7"; -} -.fa-file-movie-o:before, -.fa-file-video-o:before { - content: "\f1c8"; -} -.fa-file-code-o:before { - content: "\f1c9"; -} -.fa-vine:before { - content: "\f1ca"; -} -.fa-codepen:before { - content: "\f1cb"; -} -.fa-jsfiddle:before { - content: "\f1cc"; -} -.fa-life-bouy:before, -.fa-life-buoy:before, -.fa-life-saver:before, -.fa-support:before, -.fa-life-ring:before { - content: "\f1cd"; -} -.fa-circle-o-notch:before { - content: "\f1ce"; -} -.fa-ra:before, -.fa-resistance:before, -.fa-rebel:before { - content: "\f1d0"; -} -.fa-ge:before, -.fa-empire:before { - content: "\f1d1"; -} -.fa-git-square:before { - content: "\f1d2"; -} -.fa-git:before { - content: "\f1d3"; -} -.fa-y-combinator-square:before, -.fa-yc-square:before, -.fa-hacker-news:before { - content: "\f1d4"; -} -.fa-tencent-weibo:before { - content: "\f1d5"; -} -.fa-qq:before { - content: "\f1d6"; -} -.fa-wechat:before, -.fa-weixin:before { - content: "\f1d7"; -} -.fa-send:before, -.fa-paper-plane:before { - content: "\f1d8"; -} -.fa-send-o:before, -.fa-paper-plane-o:before { - content: "\f1d9"; -} -.fa-history:before { - content: "\f1da"; -} -.fa-circle-thin:before { - content: "\f1db"; -} -.fa-header:before { - content: "\f1dc"; -} -.fa-paragraph:before { - content: "\f1dd"; -} -.fa-sliders:before { - content: "\f1de"; -} -.fa-share-alt:before { - content: "\f1e0"; -} -.fa-share-alt-square:before { - content: "\f1e1"; -} -.fa-bomb:before { - content: "\f1e2"; -} -.fa-soccer-ball-o:before, -.fa-futbol-o:before { - content: "\f1e3"; -} -.fa-tty:before { - content: "\f1e4"; -} -.fa-binoculars:before { - content: "\f1e5"; -} -.fa-plug:before { - content: "\f1e6"; -} -.fa-slideshare:before { - content: "\f1e7"; -} -.fa-twitch:before { - content: "\f1e8"; -} -.fa-yelp:before { - content: "\f1e9"; -} -.fa-newspaper-o:before { - content: "\f1ea"; -} -.fa-wifi:before { - content: "\f1eb"; -} -.fa-calculator:before { - content: "\f1ec"; -} -.fa-paypal:before { - content: "\f1ed"; -} -.fa-google-wallet:before { - content: "\f1ee"; -} -.fa-cc-visa:before { - content: "\f1f0"; -} -.fa-cc-mastercard:before { - content: "\f1f1"; -} -.fa-cc-discover:before { - content: "\f1f2"; -} -.fa-cc-amex:before { - content: "\f1f3"; -} -.fa-cc-paypal:before { - content: "\f1f4"; -} -.fa-cc-stripe:before { - content: "\f1f5"; -} -.fa-bell-slash:before { - content: "\f1f6"; -} -.fa-bell-slash-o:before { - content: "\f1f7"; -} -.fa-trash:before { - content: "\f1f8"; -} -.fa-copyright:before { - content: "\f1f9"; -} -.fa-at:before { - content: "\f1fa"; -} -.fa-eyedropper:before { - content: "\f1fb"; -} -.fa-paint-brush:before { - content: "\f1fc"; -} -.fa-birthday-cake:before { - content: "\f1fd"; -} -.fa-area-chart:before { - content: "\f1fe"; -} -.fa-pie-chart:before { - content: "\f200"; -} -.fa-line-chart:before { - content: "\f201"; -} -.fa-lastfm:before { - content: "\f202"; -} -.fa-lastfm-square:before { - content: "\f203"; -} -.fa-toggle-off:before { - content: "\f204"; -} -.fa-toggle-on:before { - content: "\f205"; -} -.fa-bicycle:before { - content: "\f206"; -} -.fa-bus:before { - content: "\f207"; -} -.fa-ioxhost:before { - content: "\f208"; -} -.fa-angellist:before { - content: "\f209"; -} -.fa-cc:before { - content: "\f20a"; -} -.fa-shekel:before, -.fa-sheqel:before, -.fa-ils:before { - content: "\f20b"; -} -.fa-meanpath:before { - content: "\f20c"; -} -.fa-buysellads:before { - content: "\f20d"; -} -.fa-connectdevelop:before { - content: "\f20e"; -} -.fa-dashcube:before { - content: "\f210"; -} -.fa-forumbee:before { - content: "\f211"; -} -.fa-leanpub:before { - content: "\f212"; -} -.fa-sellsy:before { - content: "\f213"; -} -.fa-shirtsinbulk:before { - content: "\f214"; -} -.fa-simplybuilt:before { - content: "\f215"; -} -.fa-skyatlas:before { - content: "\f216"; -} -.fa-cart-plus:before { - content: "\f217"; -} -.fa-cart-arrow-down:before { - content: "\f218"; -} -.fa-diamond:before { - content: "\f219"; -} -.fa-ship:before { - content: "\f21a"; -} -.fa-user-secret:before { - content: "\f21b"; -} -.fa-motorcycle:before { - content: "\f21c"; -} -.fa-street-view:before { - content: "\f21d"; -} -.fa-heartbeat:before { - content: "\f21e"; -} -.fa-venus:before { - content: "\f221"; -} -.fa-mars:before { - content: "\f222"; -} -.fa-mercury:before { - content: "\f223"; -} -.fa-intersex:before, -.fa-transgender:before { - content: "\f224"; -} -.fa-transgender-alt:before { - content: "\f225"; -} -.fa-venus-double:before { - content: "\f226"; -} -.fa-mars-double:before { - content: "\f227"; -} -.fa-venus-mars:before { - content: "\f228"; -} -.fa-mars-stroke:before { - content: "\f229"; -} -.fa-mars-stroke-v:before { - content: "\f22a"; -} -.fa-mars-stroke-h:before { - content: "\f22b"; -} -.fa-neuter:before { - content: "\f22c"; -} -.fa-genderless:before { - content: "\f22d"; -} -.fa-facebook-official:before { - content: "\f230"; -} -.fa-pinterest-p:before { - content: "\f231"; -} -.fa-whatsapp:before { - content: "\f232"; -} -.fa-server:before { - content: "\f233"; -} -.fa-user-plus:before { - content: "\f234"; -} -.fa-user-times:before { - content: "\f235"; -} -.fa-hotel:before, -.fa-bed:before { - content: "\f236"; -} -.fa-viacoin:before { - content: "\f237"; -} -.fa-train:before { - content: "\f238"; -} -.fa-subway:before { - content: "\f239"; -} -.fa-medium:before { - content: "\f23a"; -} -.fa-yc:before, -.fa-y-combinator:before { - content: "\f23b"; -} -.fa-optin-monster:before { - content: "\f23c"; -} -.fa-opencart:before { - content: "\f23d"; -} -.fa-expeditedssl:before { - content: "\f23e"; -} -.fa-battery-4:before, -.fa-battery:before, -.fa-battery-full:before { - content: "\f240"; -} -.fa-battery-3:before, -.fa-battery-three-quarters:before { - content: "\f241"; -} -.fa-battery-2:before, -.fa-battery-half:before { - content: "\f242"; -} -.fa-battery-1:before, -.fa-battery-quarter:before { - content: "\f243"; -} -.fa-battery-0:before, -.fa-battery-empty:before { - content: "\f244"; -} -.fa-mouse-pointer:before { - content: "\f245"; -} -.fa-i-cursor:before { - content: "\f246"; -} -.fa-object-group:before { - content: "\f247"; -} -.fa-object-ungroup:before { - content: "\f248"; -} -.fa-sticky-note:before { - content: "\f249"; -} -.fa-sticky-note-o:before { - content: "\f24a"; -} -.fa-cc-jcb:before { - content: "\f24b"; -} -.fa-cc-diners-club:before { - content: "\f24c"; -} -.fa-clone:before { - content: "\f24d"; -} -.fa-balance-scale:before { - content: "\f24e"; -} -.fa-hourglass-o:before { - content: "\f250"; -} -.fa-hourglass-1:before, -.fa-hourglass-start:before { - content: "\f251"; -} -.fa-hourglass-2:before, -.fa-hourglass-half:before { - content: "\f252"; -} -.fa-hourglass-3:before, -.fa-hourglass-end:before { - content: "\f253"; -} -.fa-hourglass:before { - content: "\f254"; -} -.fa-hand-grab-o:before, -.fa-hand-rock-o:before { - content: "\f255"; -} -.fa-hand-stop-o:before, -.fa-hand-paper-o:before { - content: "\f256"; -} -.fa-hand-scissors-o:before { - content: "\f257"; -} -.fa-hand-lizard-o:before { - content: "\f258"; -} -.fa-hand-spock-o:before { - content: "\f259"; -} -.fa-hand-pointer-o:before { - content: "\f25a"; -} -.fa-hand-peace-o:before { - content: "\f25b"; -} -.fa-trademark:before { - content: "\f25c"; -} -.fa-registered:before { - content: "\f25d"; -} -.fa-creative-commons:before { - content: "\f25e"; -} -.fa-gg:before { - content: "\f260"; -} -.fa-gg-circle:before { - content: "\f261"; -} -.fa-tripadvisor:before { - content: "\f262"; -} -.fa-odnoklassniki:before { - content: "\f263"; -} -.fa-odnoklassniki-square:before { - content: "\f264"; -} -.fa-get-pocket:before { - content: "\f265"; -} -.fa-wikipedia-w:before { - content: "\f266"; -} -.fa-safari:before { - content: "\f267"; -} -.fa-chrome:before { - content: "\f268"; -} -.fa-firefox:before { - content: "\f269"; -} -.fa-opera:before { - content: "\f26a"; -} -.fa-internet-explorer:before { - content: "\f26b"; -} -.fa-tv:before, -.fa-television:before { - content: "\f26c"; -} -.fa-contao:before { - content: "\f26d"; -} -.fa-500px:before { - content: "\f26e"; -} -.fa-amazon:before { - content: "\f270"; -} -.fa-calendar-plus-o:before { - content: "\f271"; -} -.fa-calendar-minus-o:before { - content: "\f272"; -} -.fa-calendar-times-o:before { - content: "\f273"; -} -.fa-calendar-check-o:before { - content: "\f274"; -} -.fa-industry:before { - content: "\f275"; -} -.fa-map-pin:before { - content: "\f276"; -} -.fa-map-signs:before { - content: "\f277"; -} -.fa-map-o:before { - content: "\f278"; -} -.fa-map:before { - content: "\f279"; -} -.fa-commenting:before { - content: "\f27a"; -} -.fa-commenting-o:before { - content: "\f27b"; -} -.fa-houzz:before { - content: "\f27c"; -} -.fa-vimeo:before { - content: "\f27d"; -} -.fa-black-tie:before { - content: "\f27e"; -} -.fa-fonticons:before { - content: "\f280"; -} -.fa-reddit-alien:before { - content: "\f281"; -} -.fa-edge:before { - content: "\f282"; -} -.fa-credit-card-alt:before { - content: "\f283"; -} -.fa-codiepie:before { - content: "\f284"; -} -.fa-modx:before { - content: "\f285"; -} -.fa-fort-awesome:before { - content: "\f286"; -} -.fa-usb:before { - content: "\f287"; -} -.fa-product-hunt:before { - content: "\f288"; -} -.fa-mixcloud:before { - content: "\f289"; -} -.fa-scribd:before { - content: "\f28a"; -} -.fa-pause-circle:before { - content: "\f28b"; -} -.fa-pause-circle-o:before { - content: "\f28c"; -} -.fa-stop-circle:before { - content: "\f28d"; -} -.fa-stop-circle-o:before { - content: "\f28e"; -} -.fa-shopping-bag:before { - content: "\f290"; -} -.fa-shopping-basket:before { - content: "\f291"; -} -.fa-hashtag:before { - content: "\f292"; -} -.fa-bluetooth:before { - content: "\f293"; -} -.fa-bluetooth-b:before { - content: "\f294"; -} -.fa-percent:before { - content: "\f295"; -} -.fa-gitlab:before { - content: "\f296"; -} -.fa-wpbeginner:before { - content: "\f297"; -} -.fa-wpforms:before { - content: "\f298"; -} -.fa-envira:before { - content: "\f299"; -} -.fa-universal-access:before { - content: "\f29a"; -} -.fa-wheelchair-alt:before { - content: "\f29b"; -} -.fa-question-circle-o:before { - content: "\f29c"; -} -.fa-blind:before { - content: "\f29d"; -} -.fa-audio-description:before { - content: "\f29e"; -} -.fa-volume-control-phone:before { - content: "\f2a0"; -} -.fa-braille:before { - content: "\f2a1"; -} -.fa-assistive-listening-systems:before { - content: "\f2a2"; -} -.fa-asl-interpreting:before, -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; -} -.fa-deafness:before, -.fa-hard-of-hearing:before, -.fa-deaf:before { - content: "\f2a4"; -} -.fa-glide:before { - content: "\f2a5"; -} -.fa-glide-g:before { - content: "\f2a6"; -} -.fa-signing:before, -.fa-sign-language:before { - content: "\f2a7"; -} -.fa-low-vision:before { - content: "\f2a8"; -} -.fa-viadeo:before { - content: "\f2a9"; -} -.fa-viadeo-square:before { - content: "\f2aa"; -} -.fa-snapchat:before { - content: "\f2ab"; -} -.fa-snapchat-ghost:before { - content: "\f2ac"; -} -.fa-snapchat-square:before { - content: "\f2ad"; -} -.fa-pied-piper:before { - content: "\f2ae"; -} -.fa-first-order:before { - content: "\f2b0"; -} -.fa-yoast:before { - content: "\f2b1"; -} -.fa-themeisle:before { - content: "\f2b2"; -} -.fa-google-plus-circle:before, -.fa-google-plus-official:before { - content: "\f2b3"; -} -.fa-fa:before, -.fa-font-awesome:before { - content: "\f2b4"; -} -.fa-handshake-o:before { - content: "\f2b5"; -} -.fa-envelope-open:before { - content: "\f2b6"; -} -.fa-envelope-open-o:before { - content: "\f2b7"; -} -.fa-linode:before { - content: "\f2b8"; -} -.fa-address-book:before { - content: "\f2b9"; -} -.fa-address-book-o:before { - content: "\f2ba"; -} -.fa-vcard:before, -.fa-address-card:before { - content: "\f2bb"; -} -.fa-vcard-o:before, -.fa-address-card-o:before { - content: "\f2bc"; -} -.fa-user-circle:before { - content: "\f2bd"; -} -.fa-user-circle-o:before { - content: "\f2be"; -} -.fa-user-o:before { - content: "\f2c0"; -} -.fa-id-badge:before { - content: "\f2c1"; -} -.fa-drivers-license:before, -.fa-id-card:before { - content: "\f2c2"; -} -.fa-drivers-license-o:before, -.fa-id-card-o:before { - content: "\f2c3"; -} -.fa-quora:before { - content: "\f2c4"; -} -.fa-free-code-camp:before { - content: "\f2c5"; -} -.fa-telegram:before { - content: "\f2c6"; -} -.fa-thermometer-4:before, -.fa-thermometer:before, -.fa-thermometer-full:before { - content: "\f2c7"; -} -.fa-thermometer-3:before, -.fa-thermometer-three-quarters:before { - content: "\f2c8"; -} -.fa-thermometer-2:before, -.fa-thermometer-half:before { - content: "\f2c9"; -} -.fa-thermometer-1:before, -.fa-thermometer-quarter:before { - content: "\f2ca"; -} -.fa-thermometer-0:before, -.fa-thermometer-empty:before { - content: "\f2cb"; -} -.fa-shower:before { - content: "\f2cc"; -} -.fa-bathtub:before, -.fa-s15:before, -.fa-bath:before { - content: "\f2cd"; -} -.fa-podcast:before { - content: "\f2ce"; -} -.fa-window-maximize:before { - content: "\f2d0"; -} -.fa-window-minimize:before { - content: "\f2d1"; -} -.fa-window-restore:before { - content: "\f2d2"; -} -.fa-times-rectangle:before, -.fa-window-close:before { - content: "\f2d3"; -} -.fa-times-rectangle-o:before, -.fa-window-close-o:before { - content: "\f2d4"; -} -.fa-bandcamp:before { - content: "\f2d5"; -} -.fa-grav:before { - content: "\f2d6"; -} -.fa-etsy:before { - content: "\f2d7"; -} -.fa-imdb:before { - content: "\f2d8"; -} -.fa-ravelry:before { - content: "\f2d9"; -} -.fa-eercast:before { - content: "\f2da"; -} -.fa-microchip:before { - content: "\f2db"; -} -.fa-snowflake-o:before { - content: "\f2dc"; -} -.fa-superpowers:before { - content: "\f2dd"; -} -.fa-wpexplorer:before { - content: "\f2de"; -} -.fa-meetup:before { - content: "\f2e0"; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} diff --git a/web/static/assets/dist/font-awesome/css/font-awesome.min.css b/web/static/assets/dist/font-awesome/css/font-awesome.min.css deleted file mode 100644 index 540440c..0000000 --- a/web/static/assets/dist/font-awesome/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.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(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-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);-ms-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{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/web/static/assets/dist/font-awesome/fonts/FontAwesome.otf b/web/static/assets/dist/font-awesome/fonts/FontAwesome.otf deleted file mode 100644 index 401ec0f..0000000 Binary files a/web/static/assets/dist/font-awesome/fonts/FontAwesome.otf and /dev/null differ diff --git a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.eot b/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca..0000000 Binary files a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.svg b/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845..0000000 --- a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.ttf b/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2..0000000 Binary files a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.woff b/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a..0000000 Binary files a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.woff2 b/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc6..0000000 Binary files a/web/static/assets/dist/font-awesome/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/web/static/assets/dist/font-awesome/less/animated.less b/web/static/assets/dist/font-awesome/less/animated.less deleted file mode 100644 index 66ad52a..0000000 --- a/web/static/assets/dist/font-awesome/less/animated.less +++ /dev/null @@ -1,34 +0,0 @@ -// Animated Icons -// -------------------------- - -.@{fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.@{fa-css-prefix}-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(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/web/static/assets/dist/font-awesome/less/bordered-pulled.less b/web/static/assets/dist/font-awesome/less/bordered-pulled.less deleted file mode 100644 index f1c8ad7..0000000 --- a/web/static/assets/dist/font-awesome/less/bordered-pulled.less +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.@{fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em @fa-border-color; - border-radius: .1em; -} - -.@{fa-css-prefix}-pull-left { float: left; } -.@{fa-css-prefix}-pull-right { float: right; } - -.@{fa-css-prefix} { - &.@{fa-css-prefix}-pull-left { margin-right: .3em; } - &.@{fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.@{fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/web/static/assets/dist/font-awesome/less/core.less b/web/static/assets/dist/font-awesome/less/core.less deleted file mode 100644 index c577ac8..0000000 --- a/web/static/assets/dist/font-awesome/less/core.less +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.@{fa-css-prefix} { - display: inline-block; - font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/web/static/assets/dist/font-awesome/less/fixed-width.less b/web/static/assets/dist/font-awesome/less/fixed-width.less deleted file mode 100644 index 110289f..0000000 --- a/web/static/assets/dist/font-awesome/less/fixed-width.less +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.@{fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/web/static/assets/dist/font-awesome/less/font-awesome.less b/web/static/assets/dist/font-awesome/less/font-awesome.less deleted file mode 100644 index c3677de..0000000 --- a/web/static/assets/dist/font-awesome/less/font-awesome.less +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables.less"; -@import "mixins.less"; -@import "path.less"; -@import "core.less"; -@import "larger.less"; -@import "fixed-width.less"; -@import "list.less"; -@import "bordered-pulled.less"; -@import "animated.less"; -@import "rotated-flipped.less"; -@import "stacked.less"; -@import "icons.less"; -@import "screen-reader.less"; diff --git a/web/static/assets/dist/font-awesome/less/icons.less b/web/static/assets/dist/font-awesome/less/icons.less deleted file mode 100644 index 159d600..0000000 --- a/web/static/assets/dist/font-awesome/less/icons.less +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } -.@{fa-css-prefix}-music:before { content: @fa-var-music; } -.@{fa-css-prefix}-search:before { content: @fa-var-search; } -.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } -.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } -.@{fa-css-prefix}-star:before { content: @fa-var-star; } -.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } -.@{fa-css-prefix}-user:before { content: @fa-var-user; } -.@{fa-css-prefix}-film:before { content: @fa-var-film; } -.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } -.@{fa-css-prefix}-th:before { content: @fa-var-th; } -.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } -.@{fa-css-prefix}-check:before { content: @fa-var-check; } -.@{fa-css-prefix}-remove:before, -.@{fa-css-prefix}-close:before, -.@{fa-css-prefix}-times:before { content: @fa-var-times; } -.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } -.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } -.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } -.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } -.@{fa-css-prefix}-gear:before, -.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } -.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } -.@{fa-css-prefix}-home:before { content: @fa-var-home; } -.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } -.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } -.@{fa-css-prefix}-road:before { content: @fa-var-road; } -.@{fa-css-prefix}-download:before { content: @fa-var-download; } -.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } -.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } -.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } -.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } -.@{fa-css-prefix}-rotate-right:before, -.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } -.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } -.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } -.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } -.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } -.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } -.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } -.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } -.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } -.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } -.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } -.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } -.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } -.@{fa-css-prefix}-book:before { content: @fa-var-book; } -.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } -.@{fa-css-prefix}-print:before { content: @fa-var-print; } -.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } -.@{fa-css-prefix}-font:before { content: @fa-var-font; } -.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } -.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } -.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } -.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } -.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } -.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } -.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } -.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } -.@{fa-css-prefix}-list:before { content: @fa-var-list; } -.@{fa-css-prefix}-dedent:before, -.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } -.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } -.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } -.@{fa-css-prefix}-photo:before, -.@{fa-css-prefix}-image:before, -.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } -.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } -.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } -.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } -.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } -.@{fa-css-prefix}-edit:before, -.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } -.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } -.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } -.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } -.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } -.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } -.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } -.@{fa-css-prefix}-play:before { content: @fa-var-play; } -.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } -.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } -.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } -.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } -.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } -.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } -.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } -.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } -.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } -.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } -.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } -.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } -.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } -.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } -.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } -.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } -.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } -.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } -.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } -.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } -.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } -.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } -.@{fa-css-prefix}-mail-forward:before, -.@{fa-css-prefix}-share:before { content: @fa-var-share; } -.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } -.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } -.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } -.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } -.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } -.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } -.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } -.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } -.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } -.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } -.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } -.@{fa-css-prefix}-warning:before, -.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } -.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } -.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } -.@{fa-css-prefix}-random:before { content: @fa-var-random; } -.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } -.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } -.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } -.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } -.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } -.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } -.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } -.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } -.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } -.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } -.@{fa-css-prefix}-bar-chart-o:before, -.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } -.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } -.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } -.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } -.@{fa-css-prefix}-key:before { content: @fa-var-key; } -.@{fa-css-prefix}-gears:before, -.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } -.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } -.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } -.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } -.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } -.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } -.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } -.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } -.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } -.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } -.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } -.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } -.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } -.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } -.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } -.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } -.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } -.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } -.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } -.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } -.@{fa-css-prefix}-facebook-f:before, -.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } -.@{fa-css-prefix}-github:before { content: @fa-var-github; } -.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } -.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } -.@{fa-css-prefix}-feed:before, -.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } -.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } -.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } -.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } -.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } -.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } -.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } -.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } -.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } -.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } -.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } -.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } -.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } -.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } -.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } -.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } -.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } -.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } -.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } -.@{fa-css-prefix}-group:before, -.@{fa-css-prefix}-users:before { content: @fa-var-users; } -.@{fa-css-prefix}-chain:before, -.@{fa-css-prefix}-link:before { content: @fa-var-link; } -.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } -.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } -.@{fa-css-prefix}-cut:before, -.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } -.@{fa-css-prefix}-copy:before, -.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } -.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } -.@{fa-css-prefix}-save:before, -.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } -.@{fa-css-prefix}-square:before { content: @fa-var-square; } -.@{fa-css-prefix}-navicon:before, -.@{fa-css-prefix}-reorder:before, -.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } -.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } -.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } -.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } -.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } -.@{fa-css-prefix}-table:before { content: @fa-var-table; } -.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } -.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } -.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } -.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } -.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } -.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } -.@{fa-css-prefix}-money:before { content: @fa-var-money; } -.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } -.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } -.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } -.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } -.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } -.@{fa-css-prefix}-unsorted:before, -.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } -.@{fa-css-prefix}-sort-down:before, -.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } -.@{fa-css-prefix}-sort-up:before, -.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } -.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } -.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } -.@{fa-css-prefix}-rotate-left:before, -.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } -.@{fa-css-prefix}-legal:before, -.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } -.@{fa-css-prefix}-dashboard:before, -.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } -.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } -.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } -.@{fa-css-prefix}-flash:before, -.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } -.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } -.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } -.@{fa-css-prefix}-paste:before, -.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } -.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } -.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } -.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } -.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } -.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } -.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } -.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } -.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } -.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } -.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } -.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } -.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } -.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } -.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } -.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } -.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } -.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } -.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } -.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } -.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } -.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } -.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } -.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } -.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } -.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } -.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } -.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } -.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } -.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } -.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } -.@{fa-css-prefix}-mobile-phone:before, -.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } -.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } -.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } -.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } -.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } -.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } -.@{fa-css-prefix}-mail-reply:before, -.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } -.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } -.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } -.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } -.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } -.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } -.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } -.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } -.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } -.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } -.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } -.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } -.@{fa-css-prefix}-code:before { content: @fa-var-code; } -.@{fa-css-prefix}-mail-reply-all:before, -.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } -.@{fa-css-prefix}-star-half-empty:before, -.@{fa-css-prefix}-star-half-full:before, -.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } -.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } -.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } -.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } -.@{fa-css-prefix}-unlink:before, -.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } -.@{fa-css-prefix}-question:before { content: @fa-var-question; } -.@{fa-css-prefix}-info:before { content: @fa-var-info; } -.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } -.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } -.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } -.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } -.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } -.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } -.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } -.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } -.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } -.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } -.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } -.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } -.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } -.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } -.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } -.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } -.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } -.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } -.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } -.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } -.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } -.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } -.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } -.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } -.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } -.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } -.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } -.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } -.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } -.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } -.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } -.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } -.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } -.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } -.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } -.@{fa-css-prefix}-toggle-down:before, -.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } -.@{fa-css-prefix}-toggle-up:before, -.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } -.@{fa-css-prefix}-toggle-right:before, -.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } -.@{fa-css-prefix}-euro:before, -.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } -.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } -.@{fa-css-prefix}-dollar:before, -.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } -.@{fa-css-prefix}-rupee:before, -.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } -.@{fa-css-prefix}-cny:before, -.@{fa-css-prefix}-rmb:before, -.@{fa-css-prefix}-yen:before, -.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } -.@{fa-css-prefix}-ruble:before, -.@{fa-css-prefix}-rouble:before, -.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } -.@{fa-css-prefix}-won:before, -.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } -.@{fa-css-prefix}-bitcoin:before, -.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } -.@{fa-css-prefix}-file:before { content: @fa-var-file; } -.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } -.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } -.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } -.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } -.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } -.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } -.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } -.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } -.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } -.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } -.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } -.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } -.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } -.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } -.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } -.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } -.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } -.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } -.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } -.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } -.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } -.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } -.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } -.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } -.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } -.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } -.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } -.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } -.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } -.@{fa-css-prefix}-android:before { content: @fa-var-android; } -.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } -.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } -.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } -.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } -.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } -.@{fa-css-prefix}-female:before { content: @fa-var-female; } -.@{fa-css-prefix}-male:before { content: @fa-var-male; } -.@{fa-css-prefix}-gittip:before, -.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } -.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } -.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } -.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } -.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } -.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } -.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } -.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } -.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } -.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } -.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } -.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } -.@{fa-css-prefix}-toggle-left:before, -.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } -.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } -.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } -.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } -.@{fa-css-prefix}-turkish-lira:before, -.@{fa-css-prefix}-try:before { content: @fa-var-try; } -.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } -.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } -.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } -.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } -.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } -.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } -.@{fa-css-prefix}-institution:before, -.@{fa-css-prefix}-bank:before, -.@{fa-css-prefix}-university:before { content: @fa-var-university; } -.@{fa-css-prefix}-mortar-board:before, -.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } -.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } -.@{fa-css-prefix}-google:before { content: @fa-var-google; } -.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } -.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } -.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } -.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } -.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } -.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } -.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } -.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } -.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } -.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } -.@{fa-css-prefix}-language:before { content: @fa-var-language; } -.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } -.@{fa-css-prefix}-building:before { content: @fa-var-building; } -.@{fa-css-prefix}-child:before { content: @fa-var-child; } -.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } -.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } -.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } -.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } -.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } -.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } -.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } -.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } -.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } -.@{fa-css-prefix}-automobile:before, -.@{fa-css-prefix}-car:before { content: @fa-var-car; } -.@{fa-css-prefix}-cab:before, -.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } -.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } -.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } -.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } -.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } -.@{fa-css-prefix}-database:before { content: @fa-var-database; } -.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } -.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } -.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } -.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } -.@{fa-css-prefix}-file-photo-o:before, -.@{fa-css-prefix}-file-picture-o:before, -.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } -.@{fa-css-prefix}-file-zip-o:before, -.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } -.@{fa-css-prefix}-file-sound-o:before, -.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } -.@{fa-css-prefix}-file-movie-o:before, -.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } -.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } -.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } -.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } -.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } -.@{fa-css-prefix}-life-bouy:before, -.@{fa-css-prefix}-life-buoy:before, -.@{fa-css-prefix}-life-saver:before, -.@{fa-css-prefix}-support:before, -.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } -.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } -.@{fa-css-prefix}-ra:before, -.@{fa-css-prefix}-resistance:before, -.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } -.@{fa-css-prefix}-ge:before, -.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } -.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } -.@{fa-css-prefix}-git:before { content: @fa-var-git; } -.@{fa-css-prefix}-y-combinator-square:before, -.@{fa-css-prefix}-yc-square:before, -.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } -.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } -.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } -.@{fa-css-prefix}-wechat:before, -.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } -.@{fa-css-prefix}-send:before, -.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } -.@{fa-css-prefix}-send-o:before, -.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } -.@{fa-css-prefix}-history:before { content: @fa-var-history; } -.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } -.@{fa-css-prefix}-header:before { content: @fa-var-header; } -.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } -.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } -.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } -.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } -.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } -.@{fa-css-prefix}-soccer-ball-o:before, -.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } -.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } -.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } -.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } -.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } -.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } -.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } -.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } -.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } -.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } -.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } -.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } -.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } -.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } -.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } -.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } -.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } -.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } -.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } -.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } -.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } -.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } -.@{fa-css-prefix}-at:before { content: @fa-var-at; } -.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } -.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } -.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } -.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } -.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } -.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } -.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } -.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } -.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } -.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } -.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } -.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } -.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } -.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } -.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } -.@{fa-css-prefix}-shekel:before, -.@{fa-css-prefix}-sheqel:before, -.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } -.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } -.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } -.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } -.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } -.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } -.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } -.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } -.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } -.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } -.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } -.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } -.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } -.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } -.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } -.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } -.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } -.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } -.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } -.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } -.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } -.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } -.@{fa-css-prefix}-intersex:before, -.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } -.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } -.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } -.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } -.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } -.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } -.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } -.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } -.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } -.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } -.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } -.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } -.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } -.@{fa-css-prefix}-server:before { content: @fa-var-server; } -.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } -.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } -.@{fa-css-prefix}-hotel:before, -.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } -.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } -.@{fa-css-prefix}-train:before { content: @fa-var-train; } -.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } -.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } -.@{fa-css-prefix}-yc:before, -.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } -.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } -.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } -.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } -.@{fa-css-prefix}-battery-4:before, -.@{fa-css-prefix}-battery:before, -.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } -.@{fa-css-prefix}-battery-3:before, -.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } -.@{fa-css-prefix}-battery-2:before, -.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } -.@{fa-css-prefix}-battery-1:before, -.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } -.@{fa-css-prefix}-battery-0:before, -.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } -.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } -.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } -.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } -.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } -.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } -.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } -.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } -.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } -.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } -.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } -.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } -.@{fa-css-prefix}-hourglass-1:before, -.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } -.@{fa-css-prefix}-hourglass-2:before, -.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } -.@{fa-css-prefix}-hourglass-3:before, -.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } -.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } -.@{fa-css-prefix}-hand-grab-o:before, -.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } -.@{fa-css-prefix}-hand-stop-o:before, -.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } -.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } -.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } -.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } -.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } -.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } -.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } -.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } -.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } -.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } -.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } -.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } -.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } -.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } -.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } -.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } -.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } -.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } -.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } -.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } -.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } -.@{fa-css-prefix}-tv:before, -.@{fa-css-prefix}-television:before { content: @fa-var-television; } -.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } -.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } -.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } -.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } -.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } -.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } -.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } -.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } -.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } -.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } -.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } -.@{fa-css-prefix}-map:before { content: @fa-var-map; } -.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } -.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } -.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } -.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } -.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } -.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } -.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } -.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } -.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } -.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } -.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } -.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } -.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } -.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } -.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } -.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } -.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } -.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } -.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } -.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } -.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } -.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } -.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } -.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } -.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } -.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } -.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } -.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } -.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } -.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } -.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } -.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } -.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } -.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } -.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } -.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } -.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } -.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } -.@{fa-css-prefix}-asl-interpreting:before, -.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } -.@{fa-css-prefix}-deafness:before, -.@{fa-css-prefix}-hard-of-hearing:before, -.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } -.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } -.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } -.@{fa-css-prefix}-signing:before, -.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } -.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } -.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } -.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } -.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } -.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } -.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } -.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } -.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } -.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } -.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } -.@{fa-css-prefix}-google-plus-circle:before, -.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } -.@{fa-css-prefix}-fa:before, -.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } -.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } -.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } -.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } -.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } -.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } -.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } -.@{fa-css-prefix}-vcard:before, -.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } -.@{fa-css-prefix}-vcard-o:before, -.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } -.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } -.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } -.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } -.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } -.@{fa-css-prefix}-drivers-license:before, -.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } -.@{fa-css-prefix}-drivers-license-o:before, -.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } -.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } -.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } -.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } -.@{fa-css-prefix}-thermometer-4:before, -.@{fa-css-prefix}-thermometer:before, -.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } -.@{fa-css-prefix}-thermometer-3:before, -.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } -.@{fa-css-prefix}-thermometer-2:before, -.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } -.@{fa-css-prefix}-thermometer-1:before, -.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } -.@{fa-css-prefix}-thermometer-0:before, -.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } -.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } -.@{fa-css-prefix}-bathtub:before, -.@{fa-css-prefix}-s15:before, -.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } -.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } -.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } -.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } -.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } -.@{fa-css-prefix}-times-rectangle:before, -.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } -.@{fa-css-prefix}-times-rectangle-o:before, -.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } -.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } -.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } -.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } -.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } -.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } -.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } -.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } -.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } -.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } -.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } -.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/web/static/assets/dist/font-awesome/less/larger.less b/web/static/assets/dist/font-awesome/less/larger.less deleted file mode 100644 index c9d6467..0000000 --- a/web/static/assets/dist/font-awesome/less/larger.less +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.@{fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.@{fa-css-prefix}-2x { font-size: 2em; } -.@{fa-css-prefix}-3x { font-size: 3em; } -.@{fa-css-prefix}-4x { font-size: 4em; } -.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/web/static/assets/dist/font-awesome/less/list.less b/web/static/assets/dist/font-awesome/less/list.less deleted file mode 100644 index 0b44038..0000000 --- a/web/static/assets/dist/font-awesome/less/list.less +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.@{fa-css-prefix}-ul { - padding-left: 0; - margin-left: @fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.@{fa-css-prefix}-li { - position: absolute; - left: -@fa-li-width; - width: @fa-li-width; - top: (2em / 14); - text-align: center; - &.@{fa-css-prefix}-lg { - left: (-@fa-li-width + (4em / 14)); - } -} diff --git a/web/static/assets/dist/font-awesome/less/mixins.less b/web/static/assets/dist/font-awesome/less/mixins.less deleted file mode 100644 index beef231..0000000 --- a/web/static/assets/dist/font-awesome/less/mixins.less +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -.fa-icon() { - display: inline-block; - font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -.fa-icon-rotate(@degrees, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; - -webkit-transform: rotate(@degrees); - -ms-transform: rotate(@degrees); - transform: rotate(@degrees); -} - -.fa-icon-flip(@horiz, @vert, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; - -webkit-transform: scale(@horiz, @vert); - -ms-transform: scale(@horiz, @vert); - transform: scale(@horiz, @vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -.sr-only() { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -.sr-only-focusable() { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/web/static/assets/dist/font-awesome/less/path.less b/web/static/assets/dist/font-awesome/less/path.less deleted file mode 100644 index 835be41..0000000 --- a/web/static/assets/dist/font-awesome/less/path.less +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); - src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), - url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), - url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), - url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), - url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); - // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/web/static/assets/dist/font-awesome/less/rotated-flipped.less b/web/static/assets/dist/font-awesome/less/rotated-flipped.less deleted file mode 100644 index f6ba814..0000000 --- a/web/static/assets/dist/font-awesome/less/rotated-flipped.less +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } -.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } -.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } - -.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } -.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .@{fa-css-prefix}-rotate-90, -:root .@{fa-css-prefix}-rotate-180, -:root .@{fa-css-prefix}-rotate-270, -:root .@{fa-css-prefix}-flip-horizontal, -:root .@{fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/web/static/assets/dist/font-awesome/less/screen-reader.less b/web/static/assets/dist/font-awesome/less/screen-reader.less deleted file mode 100644 index 11c1881..0000000 --- a/web/static/assets/dist/font-awesome/less/screen-reader.less +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { .sr-only(); } -.sr-only-focusable { .sr-only-focusable(); } diff --git a/web/static/assets/dist/font-awesome/less/stacked.less b/web/static/assets/dist/font-awesome/less/stacked.less deleted file mode 100644 index fc53fb0..0000000 --- a/web/static/assets/dist/font-awesome/less/stacked.less +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.@{fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.@{fa-css-prefix}-stack-1x { line-height: inherit; } -.@{fa-css-prefix}-stack-2x { font-size: 2em; } -.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/web/static/assets/dist/font-awesome/less/variables.less b/web/static/assets/dist/font-awesome/less/variables.less deleted file mode 100644 index 7ddbbc0..0000000 --- a/web/static/assets/dist/font-awesome/less/variables.less +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -@fa-font-path: "../fonts"; -@fa-font-size-base: 14px; -@fa-line-height-base: 1; -//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly -@fa-css-prefix: fa; -@fa-version: "4.7.0"; -@fa-border-color: #eee; -@fa-inverse: #fff; -@fa-li-width: (30em / 14); - -@fa-var-500px: "\f26e"; -@fa-var-address-book: "\f2b9"; -@fa-var-address-book-o: "\f2ba"; -@fa-var-address-card: "\f2bb"; -@fa-var-address-card-o: "\f2bc"; -@fa-var-adjust: "\f042"; -@fa-var-adn: "\f170"; -@fa-var-align-center: "\f037"; -@fa-var-align-justify: "\f039"; -@fa-var-align-left: "\f036"; -@fa-var-align-right: "\f038"; -@fa-var-amazon: "\f270"; -@fa-var-ambulance: "\f0f9"; -@fa-var-american-sign-language-interpreting: "\f2a3"; -@fa-var-anchor: "\f13d"; -@fa-var-android: "\f17b"; -@fa-var-angellist: "\f209"; -@fa-var-angle-double-down: "\f103"; -@fa-var-angle-double-left: "\f100"; -@fa-var-angle-double-right: "\f101"; -@fa-var-angle-double-up: "\f102"; -@fa-var-angle-down: "\f107"; -@fa-var-angle-left: "\f104"; -@fa-var-angle-right: "\f105"; -@fa-var-angle-up: "\f106"; -@fa-var-apple: "\f179"; -@fa-var-archive: "\f187"; -@fa-var-area-chart: "\f1fe"; -@fa-var-arrow-circle-down: "\f0ab"; -@fa-var-arrow-circle-left: "\f0a8"; -@fa-var-arrow-circle-o-down: "\f01a"; -@fa-var-arrow-circle-o-left: "\f190"; -@fa-var-arrow-circle-o-right: "\f18e"; -@fa-var-arrow-circle-o-up: "\f01b"; -@fa-var-arrow-circle-right: "\f0a9"; -@fa-var-arrow-circle-up: "\f0aa"; -@fa-var-arrow-down: "\f063"; -@fa-var-arrow-left: "\f060"; -@fa-var-arrow-right: "\f061"; -@fa-var-arrow-up: "\f062"; -@fa-var-arrows: "\f047"; -@fa-var-arrows-alt: "\f0b2"; -@fa-var-arrows-h: "\f07e"; -@fa-var-arrows-v: "\f07d"; -@fa-var-asl-interpreting: "\f2a3"; -@fa-var-assistive-listening-systems: "\f2a2"; -@fa-var-asterisk: "\f069"; -@fa-var-at: "\f1fa"; -@fa-var-audio-description: "\f29e"; -@fa-var-automobile: "\f1b9"; -@fa-var-backward: "\f04a"; -@fa-var-balance-scale: "\f24e"; -@fa-var-ban: "\f05e"; -@fa-var-bandcamp: "\f2d5"; -@fa-var-bank: "\f19c"; -@fa-var-bar-chart: "\f080"; -@fa-var-bar-chart-o: "\f080"; -@fa-var-barcode: "\f02a"; -@fa-var-bars: "\f0c9"; -@fa-var-bath: "\f2cd"; -@fa-var-bathtub: "\f2cd"; -@fa-var-battery: "\f240"; -@fa-var-battery-0: "\f244"; -@fa-var-battery-1: "\f243"; -@fa-var-battery-2: "\f242"; -@fa-var-battery-3: "\f241"; -@fa-var-battery-4: "\f240"; -@fa-var-battery-empty: "\f244"; -@fa-var-battery-full: "\f240"; -@fa-var-battery-half: "\f242"; -@fa-var-battery-quarter: "\f243"; -@fa-var-battery-three-quarters: "\f241"; -@fa-var-bed: "\f236"; -@fa-var-beer: "\f0fc"; -@fa-var-behance: "\f1b4"; -@fa-var-behance-square: "\f1b5"; -@fa-var-bell: "\f0f3"; -@fa-var-bell-o: "\f0a2"; -@fa-var-bell-slash: "\f1f6"; -@fa-var-bell-slash-o: "\f1f7"; -@fa-var-bicycle: "\f206"; -@fa-var-binoculars: "\f1e5"; -@fa-var-birthday-cake: "\f1fd"; -@fa-var-bitbucket: "\f171"; -@fa-var-bitbucket-square: "\f172"; -@fa-var-bitcoin: "\f15a"; -@fa-var-black-tie: "\f27e"; -@fa-var-blind: "\f29d"; -@fa-var-bluetooth: "\f293"; -@fa-var-bluetooth-b: "\f294"; -@fa-var-bold: "\f032"; -@fa-var-bolt: "\f0e7"; -@fa-var-bomb: "\f1e2"; -@fa-var-book: "\f02d"; -@fa-var-bookmark: "\f02e"; -@fa-var-bookmark-o: "\f097"; -@fa-var-braille: "\f2a1"; -@fa-var-briefcase: "\f0b1"; -@fa-var-btc: "\f15a"; -@fa-var-bug: "\f188"; -@fa-var-building: "\f1ad"; -@fa-var-building-o: "\f0f7"; -@fa-var-bullhorn: "\f0a1"; -@fa-var-bullseye: "\f140"; -@fa-var-bus: "\f207"; -@fa-var-buysellads: "\f20d"; -@fa-var-cab: "\f1ba"; -@fa-var-calculator: "\f1ec"; -@fa-var-calendar: "\f073"; -@fa-var-calendar-check-o: "\f274"; -@fa-var-calendar-minus-o: "\f272"; -@fa-var-calendar-o: "\f133"; -@fa-var-calendar-plus-o: "\f271"; -@fa-var-calendar-times-o: "\f273"; -@fa-var-camera: "\f030"; -@fa-var-camera-retro: "\f083"; -@fa-var-car: "\f1b9"; -@fa-var-caret-down: "\f0d7"; -@fa-var-caret-left: "\f0d9"; -@fa-var-caret-right: "\f0da"; -@fa-var-caret-square-o-down: "\f150"; -@fa-var-caret-square-o-left: "\f191"; -@fa-var-caret-square-o-right: "\f152"; -@fa-var-caret-square-o-up: "\f151"; -@fa-var-caret-up: "\f0d8"; -@fa-var-cart-arrow-down: "\f218"; -@fa-var-cart-plus: "\f217"; -@fa-var-cc: "\f20a"; -@fa-var-cc-amex: "\f1f3"; -@fa-var-cc-diners-club: "\f24c"; -@fa-var-cc-discover: "\f1f2"; -@fa-var-cc-jcb: "\f24b"; -@fa-var-cc-mastercard: "\f1f1"; -@fa-var-cc-paypal: "\f1f4"; -@fa-var-cc-stripe: "\f1f5"; -@fa-var-cc-visa: "\f1f0"; -@fa-var-certificate: "\f0a3"; -@fa-var-chain: "\f0c1"; -@fa-var-chain-broken: "\f127"; -@fa-var-check: "\f00c"; -@fa-var-check-circle: "\f058"; -@fa-var-check-circle-o: "\f05d"; -@fa-var-check-square: "\f14a"; -@fa-var-check-square-o: "\f046"; -@fa-var-chevron-circle-down: "\f13a"; -@fa-var-chevron-circle-left: "\f137"; -@fa-var-chevron-circle-right: "\f138"; -@fa-var-chevron-circle-up: "\f139"; -@fa-var-chevron-down: "\f078"; -@fa-var-chevron-left: "\f053"; -@fa-var-chevron-right: "\f054"; -@fa-var-chevron-up: "\f077"; -@fa-var-child: "\f1ae"; -@fa-var-chrome: "\f268"; -@fa-var-circle: "\f111"; -@fa-var-circle-o: "\f10c"; -@fa-var-circle-o-notch: "\f1ce"; -@fa-var-circle-thin: "\f1db"; -@fa-var-clipboard: "\f0ea"; -@fa-var-clock-o: "\f017"; -@fa-var-clone: "\f24d"; -@fa-var-close: "\f00d"; -@fa-var-cloud: "\f0c2"; -@fa-var-cloud-download: "\f0ed"; -@fa-var-cloud-upload: "\f0ee"; -@fa-var-cny: "\f157"; -@fa-var-code: "\f121"; -@fa-var-code-fork: "\f126"; -@fa-var-codepen: "\f1cb"; -@fa-var-codiepie: "\f284"; -@fa-var-coffee: "\f0f4"; -@fa-var-cog: "\f013"; -@fa-var-cogs: "\f085"; -@fa-var-columns: "\f0db"; -@fa-var-comment: "\f075"; -@fa-var-comment-o: "\f0e5"; -@fa-var-commenting: "\f27a"; -@fa-var-commenting-o: "\f27b"; -@fa-var-comments: "\f086"; -@fa-var-comments-o: "\f0e6"; -@fa-var-compass: "\f14e"; -@fa-var-compress: "\f066"; -@fa-var-connectdevelop: "\f20e"; -@fa-var-contao: "\f26d"; -@fa-var-copy: "\f0c5"; -@fa-var-copyright: "\f1f9"; -@fa-var-creative-commons: "\f25e"; -@fa-var-credit-card: "\f09d"; -@fa-var-credit-card-alt: "\f283"; -@fa-var-crop: "\f125"; -@fa-var-crosshairs: "\f05b"; -@fa-var-css3: "\f13c"; -@fa-var-cube: "\f1b2"; -@fa-var-cubes: "\f1b3"; -@fa-var-cut: "\f0c4"; -@fa-var-cutlery: "\f0f5"; -@fa-var-dashboard: "\f0e4"; -@fa-var-dashcube: "\f210"; -@fa-var-database: "\f1c0"; -@fa-var-deaf: "\f2a4"; -@fa-var-deafness: "\f2a4"; -@fa-var-dedent: "\f03b"; -@fa-var-delicious: "\f1a5"; -@fa-var-desktop: "\f108"; -@fa-var-deviantart: "\f1bd"; -@fa-var-diamond: "\f219"; -@fa-var-digg: "\f1a6"; -@fa-var-dollar: "\f155"; -@fa-var-dot-circle-o: "\f192"; -@fa-var-download: "\f019"; -@fa-var-dribbble: "\f17d"; -@fa-var-drivers-license: "\f2c2"; -@fa-var-drivers-license-o: "\f2c3"; -@fa-var-dropbox: "\f16b"; -@fa-var-drupal: "\f1a9"; -@fa-var-edge: "\f282"; -@fa-var-edit: "\f044"; -@fa-var-eercast: "\f2da"; -@fa-var-eject: "\f052"; -@fa-var-ellipsis-h: "\f141"; -@fa-var-ellipsis-v: "\f142"; -@fa-var-empire: "\f1d1"; -@fa-var-envelope: "\f0e0"; -@fa-var-envelope-o: "\f003"; -@fa-var-envelope-open: "\f2b6"; -@fa-var-envelope-open-o: "\f2b7"; -@fa-var-envelope-square: "\f199"; -@fa-var-envira: "\f299"; -@fa-var-eraser: "\f12d"; -@fa-var-etsy: "\f2d7"; -@fa-var-eur: "\f153"; -@fa-var-euro: "\f153"; -@fa-var-exchange: "\f0ec"; -@fa-var-exclamation: "\f12a"; -@fa-var-exclamation-circle: "\f06a"; -@fa-var-exclamation-triangle: "\f071"; -@fa-var-expand: "\f065"; -@fa-var-expeditedssl: "\f23e"; -@fa-var-external-link: "\f08e"; -@fa-var-external-link-square: "\f14c"; -@fa-var-eye: "\f06e"; -@fa-var-eye-slash: "\f070"; -@fa-var-eyedropper: "\f1fb"; -@fa-var-fa: "\f2b4"; -@fa-var-facebook: "\f09a"; -@fa-var-facebook-f: "\f09a"; -@fa-var-facebook-official: "\f230"; -@fa-var-facebook-square: "\f082"; -@fa-var-fast-backward: "\f049"; -@fa-var-fast-forward: "\f050"; -@fa-var-fax: "\f1ac"; -@fa-var-feed: "\f09e"; -@fa-var-female: "\f182"; -@fa-var-fighter-jet: "\f0fb"; -@fa-var-file: "\f15b"; -@fa-var-file-archive-o: "\f1c6"; -@fa-var-file-audio-o: "\f1c7"; -@fa-var-file-code-o: "\f1c9"; -@fa-var-file-excel-o: "\f1c3"; -@fa-var-file-image-o: "\f1c5"; -@fa-var-file-movie-o: "\f1c8"; -@fa-var-file-o: "\f016"; -@fa-var-file-pdf-o: "\f1c1"; -@fa-var-file-photo-o: "\f1c5"; -@fa-var-file-picture-o: "\f1c5"; -@fa-var-file-powerpoint-o: "\f1c4"; -@fa-var-file-sound-o: "\f1c7"; -@fa-var-file-text: "\f15c"; -@fa-var-file-text-o: "\f0f6"; -@fa-var-file-video-o: "\f1c8"; -@fa-var-file-word-o: "\f1c2"; -@fa-var-file-zip-o: "\f1c6"; -@fa-var-files-o: "\f0c5"; -@fa-var-film: "\f008"; -@fa-var-filter: "\f0b0"; -@fa-var-fire: "\f06d"; -@fa-var-fire-extinguisher: "\f134"; -@fa-var-firefox: "\f269"; -@fa-var-first-order: "\f2b0"; -@fa-var-flag: "\f024"; -@fa-var-flag-checkered: "\f11e"; -@fa-var-flag-o: "\f11d"; -@fa-var-flash: "\f0e7"; -@fa-var-flask: "\f0c3"; -@fa-var-flickr: "\f16e"; -@fa-var-floppy-o: "\f0c7"; -@fa-var-folder: "\f07b"; -@fa-var-folder-o: "\f114"; -@fa-var-folder-open: "\f07c"; -@fa-var-folder-open-o: "\f115"; -@fa-var-font: "\f031"; -@fa-var-font-awesome: "\f2b4"; -@fa-var-fonticons: "\f280"; -@fa-var-fort-awesome: "\f286"; -@fa-var-forumbee: "\f211"; -@fa-var-forward: "\f04e"; -@fa-var-foursquare: "\f180"; -@fa-var-free-code-camp: "\f2c5"; -@fa-var-frown-o: "\f119"; -@fa-var-futbol-o: "\f1e3"; -@fa-var-gamepad: "\f11b"; -@fa-var-gavel: "\f0e3"; -@fa-var-gbp: "\f154"; -@fa-var-ge: "\f1d1"; -@fa-var-gear: "\f013"; -@fa-var-gears: "\f085"; -@fa-var-genderless: "\f22d"; -@fa-var-get-pocket: "\f265"; -@fa-var-gg: "\f260"; -@fa-var-gg-circle: "\f261"; -@fa-var-gift: "\f06b"; -@fa-var-git: "\f1d3"; -@fa-var-git-square: "\f1d2"; -@fa-var-github: "\f09b"; -@fa-var-github-alt: "\f113"; -@fa-var-github-square: "\f092"; -@fa-var-gitlab: "\f296"; -@fa-var-gittip: "\f184"; -@fa-var-glass: "\f000"; -@fa-var-glide: "\f2a5"; -@fa-var-glide-g: "\f2a6"; -@fa-var-globe: "\f0ac"; -@fa-var-google: "\f1a0"; -@fa-var-google-plus: "\f0d5"; -@fa-var-google-plus-circle: "\f2b3"; -@fa-var-google-plus-official: "\f2b3"; -@fa-var-google-plus-square: "\f0d4"; -@fa-var-google-wallet: "\f1ee"; -@fa-var-graduation-cap: "\f19d"; -@fa-var-gratipay: "\f184"; -@fa-var-grav: "\f2d6"; -@fa-var-group: "\f0c0"; -@fa-var-h-square: "\f0fd"; -@fa-var-hacker-news: "\f1d4"; -@fa-var-hand-grab-o: "\f255"; -@fa-var-hand-lizard-o: "\f258"; -@fa-var-hand-o-down: "\f0a7"; -@fa-var-hand-o-left: "\f0a5"; -@fa-var-hand-o-right: "\f0a4"; -@fa-var-hand-o-up: "\f0a6"; -@fa-var-hand-paper-o: "\f256"; -@fa-var-hand-peace-o: "\f25b"; -@fa-var-hand-pointer-o: "\f25a"; -@fa-var-hand-rock-o: "\f255"; -@fa-var-hand-scissors-o: "\f257"; -@fa-var-hand-spock-o: "\f259"; -@fa-var-hand-stop-o: "\f256"; -@fa-var-handshake-o: "\f2b5"; -@fa-var-hard-of-hearing: "\f2a4"; -@fa-var-hashtag: "\f292"; -@fa-var-hdd-o: "\f0a0"; -@fa-var-header: "\f1dc"; -@fa-var-headphones: "\f025"; -@fa-var-heart: "\f004"; -@fa-var-heart-o: "\f08a"; -@fa-var-heartbeat: "\f21e"; -@fa-var-history: "\f1da"; -@fa-var-home: "\f015"; -@fa-var-hospital-o: "\f0f8"; -@fa-var-hotel: "\f236"; -@fa-var-hourglass: "\f254"; -@fa-var-hourglass-1: "\f251"; -@fa-var-hourglass-2: "\f252"; -@fa-var-hourglass-3: "\f253"; -@fa-var-hourglass-end: "\f253"; -@fa-var-hourglass-half: "\f252"; -@fa-var-hourglass-o: "\f250"; -@fa-var-hourglass-start: "\f251"; -@fa-var-houzz: "\f27c"; -@fa-var-html5: "\f13b"; -@fa-var-i-cursor: "\f246"; -@fa-var-id-badge: "\f2c1"; -@fa-var-id-card: "\f2c2"; -@fa-var-id-card-o: "\f2c3"; -@fa-var-ils: "\f20b"; -@fa-var-image: "\f03e"; -@fa-var-imdb: "\f2d8"; -@fa-var-inbox: "\f01c"; -@fa-var-indent: "\f03c"; -@fa-var-industry: "\f275"; -@fa-var-info: "\f129"; -@fa-var-info-circle: "\f05a"; -@fa-var-inr: "\f156"; -@fa-var-instagram: "\f16d"; -@fa-var-institution: "\f19c"; -@fa-var-internet-explorer: "\f26b"; -@fa-var-intersex: "\f224"; -@fa-var-ioxhost: "\f208"; -@fa-var-italic: "\f033"; -@fa-var-joomla: "\f1aa"; -@fa-var-jpy: "\f157"; -@fa-var-jsfiddle: "\f1cc"; -@fa-var-key: "\f084"; -@fa-var-keyboard-o: "\f11c"; -@fa-var-krw: "\f159"; -@fa-var-language: "\f1ab"; -@fa-var-laptop: "\f109"; -@fa-var-lastfm: "\f202"; -@fa-var-lastfm-square: "\f203"; -@fa-var-leaf: "\f06c"; -@fa-var-leanpub: "\f212"; -@fa-var-legal: "\f0e3"; -@fa-var-lemon-o: "\f094"; -@fa-var-level-down: "\f149"; -@fa-var-level-up: "\f148"; -@fa-var-life-bouy: "\f1cd"; -@fa-var-life-buoy: "\f1cd"; -@fa-var-life-ring: "\f1cd"; -@fa-var-life-saver: "\f1cd"; -@fa-var-lightbulb-o: "\f0eb"; -@fa-var-line-chart: "\f201"; -@fa-var-link: "\f0c1"; -@fa-var-linkedin: "\f0e1"; -@fa-var-linkedin-square: "\f08c"; -@fa-var-linode: "\f2b8"; -@fa-var-linux: "\f17c"; -@fa-var-list: "\f03a"; -@fa-var-list-alt: "\f022"; -@fa-var-list-ol: "\f0cb"; -@fa-var-list-ul: "\f0ca"; -@fa-var-location-arrow: "\f124"; -@fa-var-lock: "\f023"; -@fa-var-long-arrow-down: "\f175"; -@fa-var-long-arrow-left: "\f177"; -@fa-var-long-arrow-right: "\f178"; -@fa-var-long-arrow-up: "\f176"; -@fa-var-low-vision: "\f2a8"; -@fa-var-magic: "\f0d0"; -@fa-var-magnet: "\f076"; -@fa-var-mail-forward: "\f064"; -@fa-var-mail-reply: "\f112"; -@fa-var-mail-reply-all: "\f122"; -@fa-var-male: "\f183"; -@fa-var-map: "\f279"; -@fa-var-map-marker: "\f041"; -@fa-var-map-o: "\f278"; -@fa-var-map-pin: "\f276"; -@fa-var-map-signs: "\f277"; -@fa-var-mars: "\f222"; -@fa-var-mars-double: "\f227"; -@fa-var-mars-stroke: "\f229"; -@fa-var-mars-stroke-h: "\f22b"; -@fa-var-mars-stroke-v: "\f22a"; -@fa-var-maxcdn: "\f136"; -@fa-var-meanpath: "\f20c"; -@fa-var-medium: "\f23a"; -@fa-var-medkit: "\f0fa"; -@fa-var-meetup: "\f2e0"; -@fa-var-meh-o: "\f11a"; -@fa-var-mercury: "\f223"; -@fa-var-microchip: "\f2db"; -@fa-var-microphone: "\f130"; -@fa-var-microphone-slash: "\f131"; -@fa-var-minus: "\f068"; -@fa-var-minus-circle: "\f056"; -@fa-var-minus-square: "\f146"; -@fa-var-minus-square-o: "\f147"; -@fa-var-mixcloud: "\f289"; -@fa-var-mobile: "\f10b"; -@fa-var-mobile-phone: "\f10b"; -@fa-var-modx: "\f285"; -@fa-var-money: "\f0d6"; -@fa-var-moon-o: "\f186"; -@fa-var-mortar-board: "\f19d"; -@fa-var-motorcycle: "\f21c"; -@fa-var-mouse-pointer: "\f245"; -@fa-var-music: "\f001"; -@fa-var-navicon: "\f0c9"; -@fa-var-neuter: "\f22c"; -@fa-var-newspaper-o: "\f1ea"; -@fa-var-object-group: "\f247"; -@fa-var-object-ungroup: "\f248"; -@fa-var-odnoklassniki: "\f263"; -@fa-var-odnoklassniki-square: "\f264"; -@fa-var-opencart: "\f23d"; -@fa-var-openid: "\f19b"; -@fa-var-opera: "\f26a"; -@fa-var-optin-monster: "\f23c"; -@fa-var-outdent: "\f03b"; -@fa-var-pagelines: "\f18c"; -@fa-var-paint-brush: "\f1fc"; -@fa-var-paper-plane: "\f1d8"; -@fa-var-paper-plane-o: "\f1d9"; -@fa-var-paperclip: "\f0c6"; -@fa-var-paragraph: "\f1dd"; -@fa-var-paste: "\f0ea"; -@fa-var-pause: "\f04c"; -@fa-var-pause-circle: "\f28b"; -@fa-var-pause-circle-o: "\f28c"; -@fa-var-paw: "\f1b0"; -@fa-var-paypal: "\f1ed"; -@fa-var-pencil: "\f040"; -@fa-var-pencil-square: "\f14b"; -@fa-var-pencil-square-o: "\f044"; -@fa-var-percent: "\f295"; -@fa-var-phone: "\f095"; -@fa-var-phone-square: "\f098"; -@fa-var-photo: "\f03e"; -@fa-var-picture-o: "\f03e"; -@fa-var-pie-chart: "\f200"; -@fa-var-pied-piper: "\f2ae"; -@fa-var-pied-piper-alt: "\f1a8"; -@fa-var-pied-piper-pp: "\f1a7"; -@fa-var-pinterest: "\f0d2"; -@fa-var-pinterest-p: "\f231"; -@fa-var-pinterest-square: "\f0d3"; -@fa-var-plane: "\f072"; -@fa-var-play: "\f04b"; -@fa-var-play-circle: "\f144"; -@fa-var-play-circle-o: "\f01d"; -@fa-var-plug: "\f1e6"; -@fa-var-plus: "\f067"; -@fa-var-plus-circle: "\f055"; -@fa-var-plus-square: "\f0fe"; -@fa-var-plus-square-o: "\f196"; -@fa-var-podcast: "\f2ce"; -@fa-var-power-off: "\f011"; -@fa-var-print: "\f02f"; -@fa-var-product-hunt: "\f288"; -@fa-var-puzzle-piece: "\f12e"; -@fa-var-qq: "\f1d6"; -@fa-var-qrcode: "\f029"; -@fa-var-question: "\f128"; -@fa-var-question-circle: "\f059"; -@fa-var-question-circle-o: "\f29c"; -@fa-var-quora: "\f2c4"; -@fa-var-quote-left: "\f10d"; -@fa-var-quote-right: "\f10e"; -@fa-var-ra: "\f1d0"; -@fa-var-random: "\f074"; -@fa-var-ravelry: "\f2d9"; -@fa-var-rebel: "\f1d0"; -@fa-var-recycle: "\f1b8"; -@fa-var-reddit: "\f1a1"; -@fa-var-reddit-alien: "\f281"; -@fa-var-reddit-square: "\f1a2"; -@fa-var-refresh: "\f021"; -@fa-var-registered: "\f25d"; -@fa-var-remove: "\f00d"; -@fa-var-renren: "\f18b"; -@fa-var-reorder: "\f0c9"; -@fa-var-repeat: "\f01e"; -@fa-var-reply: "\f112"; -@fa-var-reply-all: "\f122"; -@fa-var-resistance: "\f1d0"; -@fa-var-retweet: "\f079"; -@fa-var-rmb: "\f157"; -@fa-var-road: "\f018"; -@fa-var-rocket: "\f135"; -@fa-var-rotate-left: "\f0e2"; -@fa-var-rotate-right: "\f01e"; -@fa-var-rouble: "\f158"; -@fa-var-rss: "\f09e"; -@fa-var-rss-square: "\f143"; -@fa-var-rub: "\f158"; -@fa-var-ruble: "\f158"; -@fa-var-rupee: "\f156"; -@fa-var-s15: "\f2cd"; -@fa-var-safari: "\f267"; -@fa-var-save: "\f0c7"; -@fa-var-scissors: "\f0c4"; -@fa-var-scribd: "\f28a"; -@fa-var-search: "\f002"; -@fa-var-search-minus: "\f010"; -@fa-var-search-plus: "\f00e"; -@fa-var-sellsy: "\f213"; -@fa-var-send: "\f1d8"; -@fa-var-send-o: "\f1d9"; -@fa-var-server: "\f233"; -@fa-var-share: "\f064"; -@fa-var-share-alt: "\f1e0"; -@fa-var-share-alt-square: "\f1e1"; -@fa-var-share-square: "\f14d"; -@fa-var-share-square-o: "\f045"; -@fa-var-shekel: "\f20b"; -@fa-var-sheqel: "\f20b"; -@fa-var-shield: "\f132"; -@fa-var-ship: "\f21a"; -@fa-var-shirtsinbulk: "\f214"; -@fa-var-shopping-bag: "\f290"; -@fa-var-shopping-basket: "\f291"; -@fa-var-shopping-cart: "\f07a"; -@fa-var-shower: "\f2cc"; -@fa-var-sign-in: "\f090"; -@fa-var-sign-language: "\f2a7"; -@fa-var-sign-out: "\f08b"; -@fa-var-signal: "\f012"; -@fa-var-signing: "\f2a7"; -@fa-var-simplybuilt: "\f215"; -@fa-var-sitemap: "\f0e8"; -@fa-var-skyatlas: "\f216"; -@fa-var-skype: "\f17e"; -@fa-var-slack: "\f198"; -@fa-var-sliders: "\f1de"; -@fa-var-slideshare: "\f1e7"; -@fa-var-smile-o: "\f118"; -@fa-var-snapchat: "\f2ab"; -@fa-var-snapchat-ghost: "\f2ac"; -@fa-var-snapchat-square: "\f2ad"; -@fa-var-snowflake-o: "\f2dc"; -@fa-var-soccer-ball-o: "\f1e3"; -@fa-var-sort: "\f0dc"; -@fa-var-sort-alpha-asc: "\f15d"; -@fa-var-sort-alpha-desc: "\f15e"; -@fa-var-sort-amount-asc: "\f160"; -@fa-var-sort-amount-desc: "\f161"; -@fa-var-sort-asc: "\f0de"; -@fa-var-sort-desc: "\f0dd"; -@fa-var-sort-down: "\f0dd"; -@fa-var-sort-numeric-asc: "\f162"; -@fa-var-sort-numeric-desc: "\f163"; -@fa-var-sort-up: "\f0de"; -@fa-var-soundcloud: "\f1be"; -@fa-var-space-shuttle: "\f197"; -@fa-var-spinner: "\f110"; -@fa-var-spoon: "\f1b1"; -@fa-var-spotify: "\f1bc"; -@fa-var-square: "\f0c8"; -@fa-var-square-o: "\f096"; -@fa-var-stack-exchange: "\f18d"; -@fa-var-stack-overflow: "\f16c"; -@fa-var-star: "\f005"; -@fa-var-star-half: "\f089"; -@fa-var-star-half-empty: "\f123"; -@fa-var-star-half-full: "\f123"; -@fa-var-star-half-o: "\f123"; -@fa-var-star-o: "\f006"; -@fa-var-steam: "\f1b6"; -@fa-var-steam-square: "\f1b7"; -@fa-var-step-backward: "\f048"; -@fa-var-step-forward: "\f051"; -@fa-var-stethoscope: "\f0f1"; -@fa-var-sticky-note: "\f249"; -@fa-var-sticky-note-o: "\f24a"; -@fa-var-stop: "\f04d"; -@fa-var-stop-circle: "\f28d"; -@fa-var-stop-circle-o: "\f28e"; -@fa-var-street-view: "\f21d"; -@fa-var-strikethrough: "\f0cc"; -@fa-var-stumbleupon: "\f1a4"; -@fa-var-stumbleupon-circle: "\f1a3"; -@fa-var-subscript: "\f12c"; -@fa-var-subway: "\f239"; -@fa-var-suitcase: "\f0f2"; -@fa-var-sun-o: "\f185"; -@fa-var-superpowers: "\f2dd"; -@fa-var-superscript: "\f12b"; -@fa-var-support: "\f1cd"; -@fa-var-table: "\f0ce"; -@fa-var-tablet: "\f10a"; -@fa-var-tachometer: "\f0e4"; -@fa-var-tag: "\f02b"; -@fa-var-tags: "\f02c"; -@fa-var-tasks: "\f0ae"; -@fa-var-taxi: "\f1ba"; -@fa-var-telegram: "\f2c6"; -@fa-var-television: "\f26c"; -@fa-var-tencent-weibo: "\f1d5"; -@fa-var-terminal: "\f120"; -@fa-var-text-height: "\f034"; -@fa-var-text-width: "\f035"; -@fa-var-th: "\f00a"; -@fa-var-th-large: "\f009"; -@fa-var-th-list: "\f00b"; -@fa-var-themeisle: "\f2b2"; -@fa-var-thermometer: "\f2c7"; -@fa-var-thermometer-0: "\f2cb"; -@fa-var-thermometer-1: "\f2ca"; -@fa-var-thermometer-2: "\f2c9"; -@fa-var-thermometer-3: "\f2c8"; -@fa-var-thermometer-4: "\f2c7"; -@fa-var-thermometer-empty: "\f2cb"; -@fa-var-thermometer-full: "\f2c7"; -@fa-var-thermometer-half: "\f2c9"; -@fa-var-thermometer-quarter: "\f2ca"; -@fa-var-thermometer-three-quarters: "\f2c8"; -@fa-var-thumb-tack: "\f08d"; -@fa-var-thumbs-down: "\f165"; -@fa-var-thumbs-o-down: "\f088"; -@fa-var-thumbs-o-up: "\f087"; -@fa-var-thumbs-up: "\f164"; -@fa-var-ticket: "\f145"; -@fa-var-times: "\f00d"; -@fa-var-times-circle: "\f057"; -@fa-var-times-circle-o: "\f05c"; -@fa-var-times-rectangle: "\f2d3"; -@fa-var-times-rectangle-o: "\f2d4"; -@fa-var-tint: "\f043"; -@fa-var-toggle-down: "\f150"; -@fa-var-toggle-left: "\f191"; -@fa-var-toggle-off: "\f204"; -@fa-var-toggle-on: "\f205"; -@fa-var-toggle-right: "\f152"; -@fa-var-toggle-up: "\f151"; -@fa-var-trademark: "\f25c"; -@fa-var-train: "\f238"; -@fa-var-transgender: "\f224"; -@fa-var-transgender-alt: "\f225"; -@fa-var-trash: "\f1f8"; -@fa-var-trash-o: "\f014"; -@fa-var-tree: "\f1bb"; -@fa-var-trello: "\f181"; -@fa-var-tripadvisor: "\f262"; -@fa-var-trophy: "\f091"; -@fa-var-truck: "\f0d1"; -@fa-var-try: "\f195"; -@fa-var-tty: "\f1e4"; -@fa-var-tumblr: "\f173"; -@fa-var-tumblr-square: "\f174"; -@fa-var-turkish-lira: "\f195"; -@fa-var-tv: "\f26c"; -@fa-var-twitch: "\f1e8"; -@fa-var-twitter: "\f099"; -@fa-var-twitter-square: "\f081"; -@fa-var-umbrella: "\f0e9"; -@fa-var-underline: "\f0cd"; -@fa-var-undo: "\f0e2"; -@fa-var-universal-access: "\f29a"; -@fa-var-university: "\f19c"; -@fa-var-unlink: "\f127"; -@fa-var-unlock: "\f09c"; -@fa-var-unlock-alt: "\f13e"; -@fa-var-unsorted: "\f0dc"; -@fa-var-upload: "\f093"; -@fa-var-usb: "\f287"; -@fa-var-usd: "\f155"; -@fa-var-user: "\f007"; -@fa-var-user-circle: "\f2bd"; -@fa-var-user-circle-o: "\f2be"; -@fa-var-user-md: "\f0f0"; -@fa-var-user-o: "\f2c0"; -@fa-var-user-plus: "\f234"; -@fa-var-user-secret: "\f21b"; -@fa-var-user-times: "\f235"; -@fa-var-users: "\f0c0"; -@fa-var-vcard: "\f2bb"; -@fa-var-vcard-o: "\f2bc"; -@fa-var-venus: "\f221"; -@fa-var-venus-double: "\f226"; -@fa-var-venus-mars: "\f228"; -@fa-var-viacoin: "\f237"; -@fa-var-viadeo: "\f2a9"; -@fa-var-viadeo-square: "\f2aa"; -@fa-var-video-camera: "\f03d"; -@fa-var-vimeo: "\f27d"; -@fa-var-vimeo-square: "\f194"; -@fa-var-vine: "\f1ca"; -@fa-var-vk: "\f189"; -@fa-var-volume-control-phone: "\f2a0"; -@fa-var-volume-down: "\f027"; -@fa-var-volume-off: "\f026"; -@fa-var-volume-up: "\f028"; -@fa-var-warning: "\f071"; -@fa-var-wechat: "\f1d7"; -@fa-var-weibo: "\f18a"; -@fa-var-weixin: "\f1d7"; -@fa-var-whatsapp: "\f232"; -@fa-var-wheelchair: "\f193"; -@fa-var-wheelchair-alt: "\f29b"; -@fa-var-wifi: "\f1eb"; -@fa-var-wikipedia-w: "\f266"; -@fa-var-window-close: "\f2d3"; -@fa-var-window-close-o: "\f2d4"; -@fa-var-window-maximize: "\f2d0"; -@fa-var-window-minimize: "\f2d1"; -@fa-var-window-restore: "\f2d2"; -@fa-var-windows: "\f17a"; -@fa-var-won: "\f159"; -@fa-var-wordpress: "\f19a"; -@fa-var-wpbeginner: "\f297"; -@fa-var-wpexplorer: "\f2de"; -@fa-var-wpforms: "\f298"; -@fa-var-wrench: "\f0ad"; -@fa-var-xing: "\f168"; -@fa-var-xing-square: "\f169"; -@fa-var-y-combinator: "\f23b"; -@fa-var-y-combinator-square: "\f1d4"; -@fa-var-yahoo: "\f19e"; -@fa-var-yc: "\f23b"; -@fa-var-yc-square: "\f1d4"; -@fa-var-yelp: "\f1e9"; -@fa-var-yen: "\f157"; -@fa-var-yoast: "\f2b1"; -@fa-var-youtube: "\f167"; -@fa-var-youtube-play: "\f16a"; -@fa-var-youtube-square: "\f166"; - diff --git a/web/static/assets/dist/font-awesome/scss/_animated.scss b/web/static/assets/dist/font-awesome/scss/_animated.scss deleted file mode 100644 index 8a020db..0000000 --- a/web/static/assets/dist/font-awesome/scss/_animated.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Spinning Icons -// -------------------------- - -.#{$fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.#{$fa-css-prefix}-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(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/web/static/assets/dist/font-awesome/scss/_bordered-pulled.scss b/web/static/assets/dist/font-awesome/scss/_bordered-pulled.scss deleted file mode 100644 index d4b85a0..0000000 --- a/web/static/assets/dist/font-awesome/scss/_bordered-pulled.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em $fa-border-color; - border-radius: .1em; -} - -.#{$fa-css-prefix}-pull-left { float: left; } -.#{$fa-css-prefix}-pull-right { float: right; } - -.#{$fa-css-prefix} { - &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } - &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.#{$fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/web/static/assets/dist/font-awesome/scss/_core.scss b/web/static/assets/dist/font-awesome/scss/_core.scss deleted file mode 100644 index 7425ef8..0000000 --- a/web/static/assets/dist/font-awesome/scss/_core.scss +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.#{$fa-css-prefix} { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/web/static/assets/dist/font-awesome/scss/_fixed-width.scss b/web/static/assets/dist/font-awesome/scss/_fixed-width.scss deleted file mode 100644 index b221c98..0000000 --- a/web/static/assets/dist/font-awesome/scss/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/web/static/assets/dist/font-awesome/scss/_icons.scss b/web/static/assets/dist/font-awesome/scss/_icons.scss deleted file mode 100644 index e63e702..0000000 --- a/web/static/assets/dist/font-awesome/scss/_icons.scss +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } -.#{$fa-css-prefix}-music:before { content: $fa-var-music; } -.#{$fa-css-prefix}-search:before { content: $fa-var-search; } -.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } -.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } -.#{$fa-css-prefix}-star:before { content: $fa-var-star; } -.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } -.#{$fa-css-prefix}-user:before { content: $fa-var-user; } -.#{$fa-css-prefix}-film:before { content: $fa-var-film; } -.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } -.#{$fa-css-prefix}-th:before { content: $fa-var-th; } -.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } -.#{$fa-css-prefix}-check:before { content: $fa-var-check; } -.#{$fa-css-prefix}-remove:before, -.#{$fa-css-prefix}-close:before, -.#{$fa-css-prefix}-times:before { content: $fa-var-times; } -.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } -.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } -.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } -.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } -.#{$fa-css-prefix}-gear:before, -.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } -.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } -.#{$fa-css-prefix}-home:before { content: $fa-var-home; } -.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } -.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } -.#{$fa-css-prefix}-road:before { content: $fa-var-road; } -.#{$fa-css-prefix}-download:before { content: $fa-var-download; } -.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } -.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } -.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } -.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } -.#{$fa-css-prefix}-rotate-right:before, -.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } -.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } -.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } -.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } -.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } -.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } -.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } -.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } -.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } -.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } -.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } -.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } -.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } -.#{$fa-css-prefix}-book:before { content: $fa-var-book; } -.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } -.#{$fa-css-prefix}-print:before { content: $fa-var-print; } -.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } -.#{$fa-css-prefix}-font:before { content: $fa-var-font; } -.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } -.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } -.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } -.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } -.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } -.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } -.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } -.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } -.#{$fa-css-prefix}-list:before { content: $fa-var-list; } -.#{$fa-css-prefix}-dedent:before, -.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } -.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } -.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } -.#{$fa-css-prefix}-photo:before, -.#{$fa-css-prefix}-image:before, -.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } -.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } -.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } -.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } -.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } -.#{$fa-css-prefix}-edit:before, -.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } -.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } -.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } -.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } -.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } -.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } -.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } -.#{$fa-css-prefix}-play:before { content: $fa-var-play; } -.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } -.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } -.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } -.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } -.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } -.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } -.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } -.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } -.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } -.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } -.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } -.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } -.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } -.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } -.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } -.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } -.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } -.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } -.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } -.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } -.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } -.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } -.#{$fa-css-prefix}-mail-forward:before, -.#{$fa-css-prefix}-share:before { content: $fa-var-share; } -.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } -.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } -.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } -.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } -.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } -.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } -.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } -.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } -.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } -.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } -.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } -.#{$fa-css-prefix}-warning:before, -.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } -.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } -.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } -.#{$fa-css-prefix}-random:before { content: $fa-var-random; } -.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } -.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } -.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } -.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } -.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } -.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } -.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } -.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } -.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } -.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } -.#{$fa-css-prefix}-bar-chart-o:before, -.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } -.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } -.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } -.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } -.#{$fa-css-prefix}-key:before { content: $fa-var-key; } -.#{$fa-css-prefix}-gears:before, -.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } -.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } -.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } -.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } -.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } -.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } -.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } -.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } -.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } -.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } -.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } -.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } -.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } -.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } -.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } -.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } -.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } -.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } -.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } -.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } -.#{$fa-css-prefix}-facebook-f:before, -.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } -.#{$fa-css-prefix}-github:before { content: $fa-var-github; } -.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } -.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } -.#{$fa-css-prefix}-feed:before, -.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } -.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } -.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } -.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } -.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } -.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } -.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } -.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } -.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } -.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } -.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } -.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } -.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } -.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } -.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } -.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } -.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } -.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } -.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } -.#{$fa-css-prefix}-group:before, -.#{$fa-css-prefix}-users:before { content: $fa-var-users; } -.#{$fa-css-prefix}-chain:before, -.#{$fa-css-prefix}-link:before { content: $fa-var-link; } -.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } -.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } -.#{$fa-css-prefix}-cut:before, -.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } -.#{$fa-css-prefix}-copy:before, -.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } -.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } -.#{$fa-css-prefix}-save:before, -.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } -.#{$fa-css-prefix}-square:before { content: $fa-var-square; } -.#{$fa-css-prefix}-navicon:before, -.#{$fa-css-prefix}-reorder:before, -.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } -.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } -.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } -.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } -.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } -.#{$fa-css-prefix}-table:before { content: $fa-var-table; } -.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } -.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } -.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } -.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } -.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } -.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } -.#{$fa-css-prefix}-money:before { content: $fa-var-money; } -.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } -.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } -.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } -.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } -.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } -.#{$fa-css-prefix}-unsorted:before, -.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } -.#{$fa-css-prefix}-sort-down:before, -.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } -.#{$fa-css-prefix}-sort-up:before, -.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } -.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } -.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } -.#{$fa-css-prefix}-rotate-left:before, -.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } -.#{$fa-css-prefix}-legal:before, -.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } -.#{$fa-css-prefix}-dashboard:before, -.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } -.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } -.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } -.#{$fa-css-prefix}-flash:before, -.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } -.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } -.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } -.#{$fa-css-prefix}-paste:before, -.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } -.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } -.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } -.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } -.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } -.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } -.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } -.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } -.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } -.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } -.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } -.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } -.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } -.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } -.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } -.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } -.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } -.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } -.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } -.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } -.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } -.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } -.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } -.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } -.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } -.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } -.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } -.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } -.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } -.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } -.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } -.#{$fa-css-prefix}-mobile-phone:before, -.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } -.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } -.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } -.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } -.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } -.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } -.#{$fa-css-prefix}-mail-reply:before, -.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } -.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } -.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } -.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } -.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } -.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } -.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } -.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } -.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } -.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } -.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } -.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } -.#{$fa-css-prefix}-code:before { content: $fa-var-code; } -.#{$fa-css-prefix}-mail-reply-all:before, -.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } -.#{$fa-css-prefix}-star-half-empty:before, -.#{$fa-css-prefix}-star-half-full:before, -.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } -.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } -.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } -.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } -.#{$fa-css-prefix}-unlink:before, -.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } -.#{$fa-css-prefix}-question:before { content: $fa-var-question; } -.#{$fa-css-prefix}-info:before { content: $fa-var-info; } -.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } -.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } -.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } -.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } -.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } -.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } -.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } -.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } -.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } -.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } -.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } -.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } -.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } -.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } -.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } -.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } -.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } -.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } -.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } -.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } -.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } -.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } -.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } -.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } -.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } -.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } -.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } -.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } -.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } -.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } -.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } -.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } -.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } -.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } -.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } -.#{$fa-css-prefix}-toggle-down:before, -.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } -.#{$fa-css-prefix}-toggle-up:before, -.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } -.#{$fa-css-prefix}-toggle-right:before, -.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } -.#{$fa-css-prefix}-euro:before, -.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } -.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } -.#{$fa-css-prefix}-dollar:before, -.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } -.#{$fa-css-prefix}-rupee:before, -.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } -.#{$fa-css-prefix}-cny:before, -.#{$fa-css-prefix}-rmb:before, -.#{$fa-css-prefix}-yen:before, -.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } -.#{$fa-css-prefix}-ruble:before, -.#{$fa-css-prefix}-rouble:before, -.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } -.#{$fa-css-prefix}-won:before, -.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } -.#{$fa-css-prefix}-bitcoin:before, -.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } -.#{$fa-css-prefix}-file:before { content: $fa-var-file; } -.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } -.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } -.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } -.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } -.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } -.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } -.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } -.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } -.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } -.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } -.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } -.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } -.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } -.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } -.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } -.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } -.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } -.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } -.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } -.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } -.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } -.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } -.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } -.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } -.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } -.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } -.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } -.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } -.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } -.#{$fa-css-prefix}-android:before { content: $fa-var-android; } -.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } -.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } -.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } -.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } -.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } -.#{$fa-css-prefix}-female:before { content: $fa-var-female; } -.#{$fa-css-prefix}-male:before { content: $fa-var-male; } -.#{$fa-css-prefix}-gittip:before, -.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } -.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } -.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } -.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } -.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } -.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } -.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } -.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } -.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } -.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } -.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } -.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } -.#{$fa-css-prefix}-toggle-left:before, -.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } -.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } -.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } -.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } -.#{$fa-css-prefix}-turkish-lira:before, -.#{$fa-css-prefix}-try:before { content: $fa-var-try; } -.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } -.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } -.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } -.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } -.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } -.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } -.#{$fa-css-prefix}-institution:before, -.#{$fa-css-prefix}-bank:before, -.#{$fa-css-prefix}-university:before { content: $fa-var-university; } -.#{$fa-css-prefix}-mortar-board:before, -.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } -.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } -.#{$fa-css-prefix}-google:before { content: $fa-var-google; } -.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } -.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } -.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } -.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } -.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } -.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } -.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } -.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } -.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } -.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } -.#{$fa-css-prefix}-language:before { content: $fa-var-language; } -.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } -.#{$fa-css-prefix}-building:before { content: $fa-var-building; } -.#{$fa-css-prefix}-child:before { content: $fa-var-child; } -.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } -.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } -.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } -.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } -.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } -.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } -.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } -.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } -.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } -.#{$fa-css-prefix}-automobile:before, -.#{$fa-css-prefix}-car:before { content: $fa-var-car; } -.#{$fa-css-prefix}-cab:before, -.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } -.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } -.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } -.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } -.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } -.#{$fa-css-prefix}-database:before { content: $fa-var-database; } -.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } -.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } -.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } -.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } -.#{$fa-css-prefix}-file-photo-o:before, -.#{$fa-css-prefix}-file-picture-o:before, -.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } -.#{$fa-css-prefix}-file-zip-o:before, -.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } -.#{$fa-css-prefix}-file-sound-o:before, -.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } -.#{$fa-css-prefix}-file-movie-o:before, -.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } -.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } -.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } -.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } -.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } -.#{$fa-css-prefix}-life-bouy:before, -.#{$fa-css-prefix}-life-buoy:before, -.#{$fa-css-prefix}-life-saver:before, -.#{$fa-css-prefix}-support:before, -.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } -.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } -.#{$fa-css-prefix}-ra:before, -.#{$fa-css-prefix}-resistance:before, -.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } -.#{$fa-css-prefix}-ge:before, -.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } -.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } -.#{$fa-css-prefix}-git:before { content: $fa-var-git; } -.#{$fa-css-prefix}-y-combinator-square:before, -.#{$fa-css-prefix}-yc-square:before, -.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } -.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } -.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } -.#{$fa-css-prefix}-wechat:before, -.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } -.#{$fa-css-prefix}-send:before, -.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } -.#{$fa-css-prefix}-send-o:before, -.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } -.#{$fa-css-prefix}-history:before { content: $fa-var-history; } -.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } -.#{$fa-css-prefix}-header:before { content: $fa-var-header; } -.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } -.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } -.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } -.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } -.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } -.#{$fa-css-prefix}-soccer-ball-o:before, -.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } -.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } -.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } -.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } -.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } -.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } -.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } -.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } -.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } -.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } -.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } -.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } -.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } -.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } -.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } -.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } -.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } -.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } -.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } -.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } -.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } -.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } -.#{$fa-css-prefix}-at:before { content: $fa-var-at; } -.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } -.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } -.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } -.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } -.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } -.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } -.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } -.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } -.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } -.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } -.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } -.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } -.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } -.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } -.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } -.#{$fa-css-prefix}-shekel:before, -.#{$fa-css-prefix}-sheqel:before, -.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } -.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } -.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } -.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } -.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } -.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } -.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } -.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } -.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } -.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } -.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } -.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } -.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } -.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } -.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } -.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } -.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } -.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } -.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } -.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } -.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } -.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } -.#{$fa-css-prefix}-intersex:before, -.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } -.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } -.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } -.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } -.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } -.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } -.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } -.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } -.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } -.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } -.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } -.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } -.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } -.#{$fa-css-prefix}-server:before { content: $fa-var-server; } -.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } -.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } -.#{$fa-css-prefix}-hotel:before, -.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } -.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } -.#{$fa-css-prefix}-train:before { content: $fa-var-train; } -.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } -.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } -.#{$fa-css-prefix}-yc:before, -.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } -.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } -.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } -.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } -.#{$fa-css-prefix}-battery-4:before, -.#{$fa-css-prefix}-battery:before, -.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } -.#{$fa-css-prefix}-battery-3:before, -.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } -.#{$fa-css-prefix}-battery-2:before, -.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } -.#{$fa-css-prefix}-battery-1:before, -.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } -.#{$fa-css-prefix}-battery-0:before, -.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } -.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } -.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } -.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } -.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } -.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } -.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } -.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } -.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } -.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } -.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } -.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } -.#{$fa-css-prefix}-hourglass-1:before, -.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } -.#{$fa-css-prefix}-hourglass-2:before, -.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } -.#{$fa-css-prefix}-hourglass-3:before, -.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } -.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } -.#{$fa-css-prefix}-hand-grab-o:before, -.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } -.#{$fa-css-prefix}-hand-stop-o:before, -.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } -.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } -.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } -.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } -.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } -.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } -.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } -.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } -.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } -.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } -.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } -.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } -.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } -.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } -.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } -.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } -.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } -.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } -.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } -.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } -.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } -.#{$fa-css-prefix}-tv:before, -.#{$fa-css-prefix}-television:before { content: $fa-var-television; } -.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } -.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } -.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } -.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } -.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } -.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } -.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } -.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } -.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } -.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } -.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } -.#{$fa-css-prefix}-map:before { content: $fa-var-map; } -.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } -.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } -.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } -.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } -.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } -.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } -.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } -.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } -.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } -.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } -.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } -.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } -.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } -.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } -.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } -.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } -.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } -.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } -.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } -.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } -.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } -.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } -.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } -.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } -.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } -.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } -.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } -.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } -.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } -.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } -.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } -.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } -.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } -.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } -.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } -.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } -.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } -.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } -.#{$fa-css-prefix}-asl-interpreting:before, -.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } -.#{$fa-css-prefix}-deafness:before, -.#{$fa-css-prefix}-hard-of-hearing:before, -.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } -.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } -.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } -.#{$fa-css-prefix}-signing:before, -.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } -.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } -.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } -.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } -.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } -.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } -.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } -.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } -.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } -.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } -.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } -.#{$fa-css-prefix}-google-plus-circle:before, -.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } -.#{$fa-css-prefix}-fa:before, -.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } -.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } -.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } -.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } -.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } -.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } -.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } -.#{$fa-css-prefix}-vcard:before, -.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } -.#{$fa-css-prefix}-vcard-o:before, -.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } -.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } -.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } -.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } -.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } -.#{$fa-css-prefix}-drivers-license:before, -.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } -.#{$fa-css-prefix}-drivers-license-o:before, -.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } -.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } -.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } -.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } -.#{$fa-css-prefix}-thermometer-4:before, -.#{$fa-css-prefix}-thermometer:before, -.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } -.#{$fa-css-prefix}-thermometer-3:before, -.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } -.#{$fa-css-prefix}-thermometer-2:before, -.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } -.#{$fa-css-prefix}-thermometer-1:before, -.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } -.#{$fa-css-prefix}-thermometer-0:before, -.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } -.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } -.#{$fa-css-prefix}-bathtub:before, -.#{$fa-css-prefix}-s15:before, -.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } -.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } -.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } -.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } -.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } -.#{$fa-css-prefix}-times-rectangle:before, -.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } -.#{$fa-css-prefix}-times-rectangle-o:before, -.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } -.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } -.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } -.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } -.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } -.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } -.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } -.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } -.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } -.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } -.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } -.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/web/static/assets/dist/font-awesome/scss/_larger.scss b/web/static/assets/dist/font-awesome/scss/_larger.scss deleted file mode 100644 index 41e9a81..0000000 --- a/web/static/assets/dist/font-awesome/scss/_larger.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.#{$fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.#{$fa-css-prefix}-2x { font-size: 2em; } -.#{$fa-css-prefix}-3x { font-size: 3em; } -.#{$fa-css-prefix}-4x { font-size: 4em; } -.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/web/static/assets/dist/font-awesome/scss/_list.scss b/web/static/assets/dist/font-awesome/scss/_list.scss deleted file mode 100644 index 7d1e4d5..0000000 --- a/web/static/assets/dist/font-awesome/scss/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.#{$fa-css-prefix}-ul { - padding-left: 0; - margin-left: $fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.#{$fa-css-prefix}-li { - position: absolute; - left: -$fa-li-width; - width: $fa-li-width; - top: (2em / 14); - text-align: center; - &.#{$fa-css-prefix}-lg { - left: -$fa-li-width + (4em / 14); - } -} diff --git a/web/static/assets/dist/font-awesome/scss/_mixins.scss b/web/static/assets/dist/font-awesome/scss/_mixins.scss deleted file mode 100644 index c3bbd57..0000000 --- a/web/static/assets/dist/font-awesome/scss/_mixins.scss +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -@mixin fa-icon() { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -@mixin fa-icon-rotate($degrees, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; - -webkit-transform: rotate($degrees); - -ms-transform: rotate($degrees); - transform: rotate($degrees); -} - -@mixin fa-icon-flip($horiz, $vert, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; - -webkit-transform: scale($horiz, $vert); - -ms-transform: scale($horiz, $vert); - transform: scale($horiz, $vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -@mixin sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -@mixin sr-only-focusable { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/web/static/assets/dist/font-awesome/scss/_path.scss b/web/static/assets/dist/font-awesome/scss/_path.scss deleted file mode 100644 index bb457c2..0000000 --- a/web/static/assets/dist/font-awesome/scss/_path.scss +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); - src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), - url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), - url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), - url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), - url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); -// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/web/static/assets/dist/font-awesome/scss/_rotated-flipped.scss b/web/static/assets/dist/font-awesome/scss/_rotated-flipped.scss deleted file mode 100644 index a3558fd..0000000 --- a/web/static/assets/dist/font-awesome/scss/_rotated-flipped.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } -.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } -.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } - -.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } -.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .#{$fa-css-prefix}-rotate-90, -:root .#{$fa-css-prefix}-rotate-180, -:root .#{$fa-css-prefix}-rotate-270, -:root .#{$fa-css-prefix}-flip-horizontal, -:root .#{$fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/web/static/assets/dist/font-awesome/scss/_screen-reader.scss b/web/static/assets/dist/font-awesome/scss/_screen-reader.scss deleted file mode 100644 index 637426f..0000000 --- a/web/static/assets/dist/font-awesome/scss/_screen-reader.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { @include sr-only(); } -.sr-only-focusable { @include sr-only-focusable(); } diff --git a/web/static/assets/dist/font-awesome/scss/_stacked.scss b/web/static/assets/dist/font-awesome/scss/_stacked.scss deleted file mode 100644 index aef7403..0000000 --- a/web/static/assets/dist/font-awesome/scss/_stacked.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.#{$fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.#{$fa-css-prefix}-stack-1x { line-height: inherit; } -.#{$fa-css-prefix}-stack-2x { font-size: 2em; } -.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/web/static/assets/dist/font-awesome/scss/_variables.scss b/web/static/assets/dist/font-awesome/scss/_variables.scss deleted file mode 100644 index 498fc4a..0000000 --- a/web/static/assets/dist/font-awesome/scss/_variables.scss +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -$fa-font-path: "../fonts" !default; -$fa-font-size-base: 14px !default; -$fa-line-height-base: 1 !default; -//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly -$fa-css-prefix: fa !default; -$fa-version: "4.7.0" !default; -$fa-border-color: #eee !default; -$fa-inverse: #fff !default; -$fa-li-width: (30em / 14) !default; - -$fa-var-500px: "\f26e"; -$fa-var-address-book: "\f2b9"; -$fa-var-address-book-o: "\f2ba"; -$fa-var-address-card: "\f2bb"; -$fa-var-address-card-o: "\f2bc"; -$fa-var-adjust: "\f042"; -$fa-var-adn: "\f170"; -$fa-var-align-center: "\f037"; -$fa-var-align-justify: "\f039"; -$fa-var-align-left: "\f036"; -$fa-var-align-right: "\f038"; -$fa-var-amazon: "\f270"; -$fa-var-ambulance: "\f0f9"; -$fa-var-american-sign-language-interpreting: "\f2a3"; -$fa-var-anchor: "\f13d"; -$fa-var-android: "\f17b"; -$fa-var-angellist: "\f209"; -$fa-var-angle-double-down: "\f103"; -$fa-var-angle-double-left: "\f100"; -$fa-var-angle-double-right: "\f101"; -$fa-var-angle-double-up: "\f102"; -$fa-var-angle-down: "\f107"; -$fa-var-angle-left: "\f104"; -$fa-var-angle-right: "\f105"; -$fa-var-angle-up: "\f106"; -$fa-var-apple: "\f179"; -$fa-var-archive: "\f187"; -$fa-var-area-chart: "\f1fe"; -$fa-var-arrow-circle-down: "\f0ab"; -$fa-var-arrow-circle-left: "\f0a8"; -$fa-var-arrow-circle-o-down: "\f01a"; -$fa-var-arrow-circle-o-left: "\f190"; -$fa-var-arrow-circle-o-right: "\f18e"; -$fa-var-arrow-circle-o-up: "\f01b"; -$fa-var-arrow-circle-right: "\f0a9"; -$fa-var-arrow-circle-up: "\f0aa"; -$fa-var-arrow-down: "\f063"; -$fa-var-arrow-left: "\f060"; -$fa-var-arrow-right: "\f061"; -$fa-var-arrow-up: "\f062"; -$fa-var-arrows: "\f047"; -$fa-var-arrows-alt: "\f0b2"; -$fa-var-arrows-h: "\f07e"; -$fa-var-arrows-v: "\f07d"; -$fa-var-asl-interpreting: "\f2a3"; -$fa-var-assistive-listening-systems: "\f2a2"; -$fa-var-asterisk: "\f069"; -$fa-var-at: "\f1fa"; -$fa-var-audio-description: "\f29e"; -$fa-var-automobile: "\f1b9"; -$fa-var-backward: "\f04a"; -$fa-var-balance-scale: "\f24e"; -$fa-var-ban: "\f05e"; -$fa-var-bandcamp: "\f2d5"; -$fa-var-bank: "\f19c"; -$fa-var-bar-chart: "\f080"; -$fa-var-bar-chart-o: "\f080"; -$fa-var-barcode: "\f02a"; -$fa-var-bars: "\f0c9"; -$fa-var-bath: "\f2cd"; -$fa-var-bathtub: "\f2cd"; -$fa-var-battery: "\f240"; -$fa-var-battery-0: "\f244"; -$fa-var-battery-1: "\f243"; -$fa-var-battery-2: "\f242"; -$fa-var-battery-3: "\f241"; -$fa-var-battery-4: "\f240"; -$fa-var-battery-empty: "\f244"; -$fa-var-battery-full: "\f240"; -$fa-var-battery-half: "\f242"; -$fa-var-battery-quarter: "\f243"; -$fa-var-battery-three-quarters: "\f241"; -$fa-var-bed: "\f236"; -$fa-var-beer: "\f0fc"; -$fa-var-behance: "\f1b4"; -$fa-var-behance-square: "\f1b5"; -$fa-var-bell: "\f0f3"; -$fa-var-bell-o: "\f0a2"; -$fa-var-bell-slash: "\f1f6"; -$fa-var-bell-slash-o: "\f1f7"; -$fa-var-bicycle: "\f206"; -$fa-var-binoculars: "\f1e5"; -$fa-var-birthday-cake: "\f1fd"; -$fa-var-bitbucket: "\f171"; -$fa-var-bitbucket-square: "\f172"; -$fa-var-bitcoin: "\f15a"; -$fa-var-black-tie: "\f27e"; -$fa-var-blind: "\f29d"; -$fa-var-bluetooth: "\f293"; -$fa-var-bluetooth-b: "\f294"; -$fa-var-bold: "\f032"; -$fa-var-bolt: "\f0e7"; -$fa-var-bomb: "\f1e2"; -$fa-var-book: "\f02d"; -$fa-var-bookmark: "\f02e"; -$fa-var-bookmark-o: "\f097"; -$fa-var-braille: "\f2a1"; -$fa-var-briefcase: "\f0b1"; -$fa-var-btc: "\f15a"; -$fa-var-bug: "\f188"; -$fa-var-building: "\f1ad"; -$fa-var-building-o: "\f0f7"; -$fa-var-bullhorn: "\f0a1"; -$fa-var-bullseye: "\f140"; -$fa-var-bus: "\f207"; -$fa-var-buysellads: "\f20d"; -$fa-var-cab: "\f1ba"; -$fa-var-calculator: "\f1ec"; -$fa-var-calendar: "\f073"; -$fa-var-calendar-check-o: "\f274"; -$fa-var-calendar-minus-o: "\f272"; -$fa-var-calendar-o: "\f133"; -$fa-var-calendar-plus-o: "\f271"; -$fa-var-calendar-times-o: "\f273"; -$fa-var-camera: "\f030"; -$fa-var-camera-retro: "\f083"; -$fa-var-car: "\f1b9"; -$fa-var-caret-down: "\f0d7"; -$fa-var-caret-left: "\f0d9"; -$fa-var-caret-right: "\f0da"; -$fa-var-caret-square-o-down: "\f150"; -$fa-var-caret-square-o-left: "\f191"; -$fa-var-caret-square-o-right: "\f152"; -$fa-var-caret-square-o-up: "\f151"; -$fa-var-caret-up: "\f0d8"; -$fa-var-cart-arrow-down: "\f218"; -$fa-var-cart-plus: "\f217"; -$fa-var-cc: "\f20a"; -$fa-var-cc-amex: "\f1f3"; -$fa-var-cc-diners-club: "\f24c"; -$fa-var-cc-discover: "\f1f2"; -$fa-var-cc-jcb: "\f24b"; -$fa-var-cc-mastercard: "\f1f1"; -$fa-var-cc-paypal: "\f1f4"; -$fa-var-cc-stripe: "\f1f5"; -$fa-var-cc-visa: "\f1f0"; -$fa-var-certificate: "\f0a3"; -$fa-var-chain: "\f0c1"; -$fa-var-chain-broken: "\f127"; -$fa-var-check: "\f00c"; -$fa-var-check-circle: "\f058"; -$fa-var-check-circle-o: "\f05d"; -$fa-var-check-square: "\f14a"; -$fa-var-check-square-o: "\f046"; -$fa-var-chevron-circle-down: "\f13a"; -$fa-var-chevron-circle-left: "\f137"; -$fa-var-chevron-circle-right: "\f138"; -$fa-var-chevron-circle-up: "\f139"; -$fa-var-chevron-down: "\f078"; -$fa-var-chevron-left: "\f053"; -$fa-var-chevron-right: "\f054"; -$fa-var-chevron-up: "\f077"; -$fa-var-child: "\f1ae"; -$fa-var-chrome: "\f268"; -$fa-var-circle: "\f111"; -$fa-var-circle-o: "\f10c"; -$fa-var-circle-o-notch: "\f1ce"; -$fa-var-circle-thin: "\f1db"; -$fa-var-clipboard: "\f0ea"; -$fa-var-clock-o: "\f017"; -$fa-var-clone: "\f24d"; -$fa-var-close: "\f00d"; -$fa-var-cloud: "\f0c2"; -$fa-var-cloud-download: "\f0ed"; -$fa-var-cloud-upload: "\f0ee"; -$fa-var-cny: "\f157"; -$fa-var-code: "\f121"; -$fa-var-code-fork: "\f126"; -$fa-var-codepen: "\f1cb"; -$fa-var-codiepie: "\f284"; -$fa-var-coffee: "\f0f4"; -$fa-var-cog: "\f013"; -$fa-var-cogs: "\f085"; -$fa-var-columns: "\f0db"; -$fa-var-comment: "\f075"; -$fa-var-comment-o: "\f0e5"; -$fa-var-commenting: "\f27a"; -$fa-var-commenting-o: "\f27b"; -$fa-var-comments: "\f086"; -$fa-var-comments-o: "\f0e6"; -$fa-var-compass: "\f14e"; -$fa-var-compress: "\f066"; -$fa-var-connectdevelop: "\f20e"; -$fa-var-contao: "\f26d"; -$fa-var-copy: "\f0c5"; -$fa-var-copyright: "\f1f9"; -$fa-var-creative-commons: "\f25e"; -$fa-var-credit-card: "\f09d"; -$fa-var-credit-card-alt: "\f283"; -$fa-var-crop: "\f125"; -$fa-var-crosshairs: "\f05b"; -$fa-var-css3: "\f13c"; -$fa-var-cube: "\f1b2"; -$fa-var-cubes: "\f1b3"; -$fa-var-cut: "\f0c4"; -$fa-var-cutlery: "\f0f5"; -$fa-var-dashboard: "\f0e4"; -$fa-var-dashcube: "\f210"; -$fa-var-database: "\f1c0"; -$fa-var-deaf: "\f2a4"; -$fa-var-deafness: "\f2a4"; -$fa-var-dedent: "\f03b"; -$fa-var-delicious: "\f1a5"; -$fa-var-desktop: "\f108"; -$fa-var-deviantart: "\f1bd"; -$fa-var-diamond: "\f219"; -$fa-var-digg: "\f1a6"; -$fa-var-dollar: "\f155"; -$fa-var-dot-circle-o: "\f192"; -$fa-var-download: "\f019"; -$fa-var-dribbble: "\f17d"; -$fa-var-drivers-license: "\f2c2"; -$fa-var-drivers-license-o: "\f2c3"; -$fa-var-dropbox: "\f16b"; -$fa-var-drupal: "\f1a9"; -$fa-var-edge: "\f282"; -$fa-var-edit: "\f044"; -$fa-var-eercast: "\f2da"; -$fa-var-eject: "\f052"; -$fa-var-ellipsis-h: "\f141"; -$fa-var-ellipsis-v: "\f142"; -$fa-var-empire: "\f1d1"; -$fa-var-envelope: "\f0e0"; -$fa-var-envelope-o: "\f003"; -$fa-var-envelope-open: "\f2b6"; -$fa-var-envelope-open-o: "\f2b7"; -$fa-var-envelope-square: "\f199"; -$fa-var-envira: "\f299"; -$fa-var-eraser: "\f12d"; -$fa-var-etsy: "\f2d7"; -$fa-var-eur: "\f153"; -$fa-var-euro: "\f153"; -$fa-var-exchange: "\f0ec"; -$fa-var-exclamation: "\f12a"; -$fa-var-exclamation-circle: "\f06a"; -$fa-var-exclamation-triangle: "\f071"; -$fa-var-expand: "\f065"; -$fa-var-expeditedssl: "\f23e"; -$fa-var-external-link: "\f08e"; -$fa-var-external-link-square: "\f14c"; -$fa-var-eye: "\f06e"; -$fa-var-eye-slash: "\f070"; -$fa-var-eyedropper: "\f1fb"; -$fa-var-fa: "\f2b4"; -$fa-var-facebook: "\f09a"; -$fa-var-facebook-f: "\f09a"; -$fa-var-facebook-official: "\f230"; -$fa-var-facebook-square: "\f082"; -$fa-var-fast-backward: "\f049"; -$fa-var-fast-forward: "\f050"; -$fa-var-fax: "\f1ac"; -$fa-var-feed: "\f09e"; -$fa-var-female: "\f182"; -$fa-var-fighter-jet: "\f0fb"; -$fa-var-file: "\f15b"; -$fa-var-file-archive-o: "\f1c6"; -$fa-var-file-audio-o: "\f1c7"; -$fa-var-file-code-o: "\f1c9"; -$fa-var-file-excel-o: "\f1c3"; -$fa-var-file-image-o: "\f1c5"; -$fa-var-file-movie-o: "\f1c8"; -$fa-var-file-o: "\f016"; -$fa-var-file-pdf-o: "\f1c1"; -$fa-var-file-photo-o: "\f1c5"; -$fa-var-file-picture-o: "\f1c5"; -$fa-var-file-powerpoint-o: "\f1c4"; -$fa-var-file-sound-o: "\f1c7"; -$fa-var-file-text: "\f15c"; -$fa-var-file-text-o: "\f0f6"; -$fa-var-file-video-o: "\f1c8"; -$fa-var-file-word-o: "\f1c2"; -$fa-var-file-zip-o: "\f1c6"; -$fa-var-files-o: "\f0c5"; -$fa-var-film: "\f008"; -$fa-var-filter: "\f0b0"; -$fa-var-fire: "\f06d"; -$fa-var-fire-extinguisher: "\f134"; -$fa-var-firefox: "\f269"; -$fa-var-first-order: "\f2b0"; -$fa-var-flag: "\f024"; -$fa-var-flag-checkered: "\f11e"; -$fa-var-flag-o: "\f11d"; -$fa-var-flash: "\f0e7"; -$fa-var-flask: "\f0c3"; -$fa-var-flickr: "\f16e"; -$fa-var-floppy-o: "\f0c7"; -$fa-var-folder: "\f07b"; -$fa-var-folder-o: "\f114"; -$fa-var-folder-open: "\f07c"; -$fa-var-folder-open-o: "\f115"; -$fa-var-font: "\f031"; -$fa-var-font-awesome: "\f2b4"; -$fa-var-fonticons: "\f280"; -$fa-var-fort-awesome: "\f286"; -$fa-var-forumbee: "\f211"; -$fa-var-forward: "\f04e"; -$fa-var-foursquare: "\f180"; -$fa-var-free-code-camp: "\f2c5"; -$fa-var-frown-o: "\f119"; -$fa-var-futbol-o: "\f1e3"; -$fa-var-gamepad: "\f11b"; -$fa-var-gavel: "\f0e3"; -$fa-var-gbp: "\f154"; -$fa-var-ge: "\f1d1"; -$fa-var-gear: "\f013"; -$fa-var-gears: "\f085"; -$fa-var-genderless: "\f22d"; -$fa-var-get-pocket: "\f265"; -$fa-var-gg: "\f260"; -$fa-var-gg-circle: "\f261"; -$fa-var-gift: "\f06b"; -$fa-var-git: "\f1d3"; -$fa-var-git-square: "\f1d2"; -$fa-var-github: "\f09b"; -$fa-var-github-alt: "\f113"; -$fa-var-github-square: "\f092"; -$fa-var-gitlab: "\f296"; -$fa-var-gittip: "\f184"; -$fa-var-glass: "\f000"; -$fa-var-glide: "\f2a5"; -$fa-var-glide-g: "\f2a6"; -$fa-var-globe: "\f0ac"; -$fa-var-google: "\f1a0"; -$fa-var-google-plus: "\f0d5"; -$fa-var-google-plus-circle: "\f2b3"; -$fa-var-google-plus-official: "\f2b3"; -$fa-var-google-plus-square: "\f0d4"; -$fa-var-google-wallet: "\f1ee"; -$fa-var-graduation-cap: "\f19d"; -$fa-var-gratipay: "\f184"; -$fa-var-grav: "\f2d6"; -$fa-var-group: "\f0c0"; -$fa-var-h-square: "\f0fd"; -$fa-var-hacker-news: "\f1d4"; -$fa-var-hand-grab-o: "\f255"; -$fa-var-hand-lizard-o: "\f258"; -$fa-var-hand-o-down: "\f0a7"; -$fa-var-hand-o-left: "\f0a5"; -$fa-var-hand-o-right: "\f0a4"; -$fa-var-hand-o-up: "\f0a6"; -$fa-var-hand-paper-o: "\f256"; -$fa-var-hand-peace-o: "\f25b"; -$fa-var-hand-pointer-o: "\f25a"; -$fa-var-hand-rock-o: "\f255"; -$fa-var-hand-scissors-o: "\f257"; -$fa-var-hand-spock-o: "\f259"; -$fa-var-hand-stop-o: "\f256"; -$fa-var-handshake-o: "\f2b5"; -$fa-var-hard-of-hearing: "\f2a4"; -$fa-var-hashtag: "\f292"; -$fa-var-hdd-o: "\f0a0"; -$fa-var-header: "\f1dc"; -$fa-var-headphones: "\f025"; -$fa-var-heart: "\f004"; -$fa-var-heart-o: "\f08a"; -$fa-var-heartbeat: "\f21e"; -$fa-var-history: "\f1da"; -$fa-var-home: "\f015"; -$fa-var-hospital-o: "\f0f8"; -$fa-var-hotel: "\f236"; -$fa-var-hourglass: "\f254"; -$fa-var-hourglass-1: "\f251"; -$fa-var-hourglass-2: "\f252"; -$fa-var-hourglass-3: "\f253"; -$fa-var-hourglass-end: "\f253"; -$fa-var-hourglass-half: "\f252"; -$fa-var-hourglass-o: "\f250"; -$fa-var-hourglass-start: "\f251"; -$fa-var-houzz: "\f27c"; -$fa-var-html5: "\f13b"; -$fa-var-i-cursor: "\f246"; -$fa-var-id-badge: "\f2c1"; -$fa-var-id-card: "\f2c2"; -$fa-var-id-card-o: "\f2c3"; -$fa-var-ils: "\f20b"; -$fa-var-image: "\f03e"; -$fa-var-imdb: "\f2d8"; -$fa-var-inbox: "\f01c"; -$fa-var-indent: "\f03c"; -$fa-var-industry: "\f275"; -$fa-var-info: "\f129"; -$fa-var-info-circle: "\f05a"; -$fa-var-inr: "\f156"; -$fa-var-instagram: "\f16d"; -$fa-var-institution: "\f19c"; -$fa-var-internet-explorer: "\f26b"; -$fa-var-intersex: "\f224"; -$fa-var-ioxhost: "\f208"; -$fa-var-italic: "\f033"; -$fa-var-joomla: "\f1aa"; -$fa-var-jpy: "\f157"; -$fa-var-jsfiddle: "\f1cc"; -$fa-var-key: "\f084"; -$fa-var-keyboard-o: "\f11c"; -$fa-var-krw: "\f159"; -$fa-var-language: "\f1ab"; -$fa-var-laptop: "\f109"; -$fa-var-lastfm: "\f202"; -$fa-var-lastfm-square: "\f203"; -$fa-var-leaf: "\f06c"; -$fa-var-leanpub: "\f212"; -$fa-var-legal: "\f0e3"; -$fa-var-lemon-o: "\f094"; -$fa-var-level-down: "\f149"; -$fa-var-level-up: "\f148"; -$fa-var-life-bouy: "\f1cd"; -$fa-var-life-buoy: "\f1cd"; -$fa-var-life-ring: "\f1cd"; -$fa-var-life-saver: "\f1cd"; -$fa-var-lightbulb-o: "\f0eb"; -$fa-var-line-chart: "\f201"; -$fa-var-link: "\f0c1"; -$fa-var-linkedin: "\f0e1"; -$fa-var-linkedin-square: "\f08c"; -$fa-var-linode: "\f2b8"; -$fa-var-linux: "\f17c"; -$fa-var-list: "\f03a"; -$fa-var-list-alt: "\f022"; -$fa-var-list-ol: "\f0cb"; -$fa-var-list-ul: "\f0ca"; -$fa-var-location-arrow: "\f124"; -$fa-var-lock: "\f023"; -$fa-var-long-arrow-down: "\f175"; -$fa-var-long-arrow-left: "\f177"; -$fa-var-long-arrow-right: "\f178"; -$fa-var-long-arrow-up: "\f176"; -$fa-var-low-vision: "\f2a8"; -$fa-var-magic: "\f0d0"; -$fa-var-magnet: "\f076"; -$fa-var-mail-forward: "\f064"; -$fa-var-mail-reply: "\f112"; -$fa-var-mail-reply-all: "\f122"; -$fa-var-male: "\f183"; -$fa-var-map: "\f279"; -$fa-var-map-marker: "\f041"; -$fa-var-map-o: "\f278"; -$fa-var-map-pin: "\f276"; -$fa-var-map-signs: "\f277"; -$fa-var-mars: "\f222"; -$fa-var-mars-double: "\f227"; -$fa-var-mars-stroke: "\f229"; -$fa-var-mars-stroke-h: "\f22b"; -$fa-var-mars-stroke-v: "\f22a"; -$fa-var-maxcdn: "\f136"; -$fa-var-meanpath: "\f20c"; -$fa-var-medium: "\f23a"; -$fa-var-medkit: "\f0fa"; -$fa-var-meetup: "\f2e0"; -$fa-var-meh-o: "\f11a"; -$fa-var-mercury: "\f223"; -$fa-var-microchip: "\f2db"; -$fa-var-microphone: "\f130"; -$fa-var-microphone-slash: "\f131"; -$fa-var-minus: "\f068"; -$fa-var-minus-circle: "\f056"; -$fa-var-minus-square: "\f146"; -$fa-var-minus-square-o: "\f147"; -$fa-var-mixcloud: "\f289"; -$fa-var-mobile: "\f10b"; -$fa-var-mobile-phone: "\f10b"; -$fa-var-modx: "\f285"; -$fa-var-money: "\f0d6"; -$fa-var-moon-o: "\f186"; -$fa-var-mortar-board: "\f19d"; -$fa-var-motorcycle: "\f21c"; -$fa-var-mouse-pointer: "\f245"; -$fa-var-music: "\f001"; -$fa-var-navicon: "\f0c9"; -$fa-var-neuter: "\f22c"; -$fa-var-newspaper-o: "\f1ea"; -$fa-var-object-group: "\f247"; -$fa-var-object-ungroup: "\f248"; -$fa-var-odnoklassniki: "\f263"; -$fa-var-odnoklassniki-square: "\f264"; -$fa-var-opencart: "\f23d"; -$fa-var-openid: "\f19b"; -$fa-var-opera: "\f26a"; -$fa-var-optin-monster: "\f23c"; -$fa-var-outdent: "\f03b"; -$fa-var-pagelines: "\f18c"; -$fa-var-paint-brush: "\f1fc"; -$fa-var-paper-plane: "\f1d8"; -$fa-var-paper-plane-o: "\f1d9"; -$fa-var-paperclip: "\f0c6"; -$fa-var-paragraph: "\f1dd"; -$fa-var-paste: "\f0ea"; -$fa-var-pause: "\f04c"; -$fa-var-pause-circle: "\f28b"; -$fa-var-pause-circle-o: "\f28c"; -$fa-var-paw: "\f1b0"; -$fa-var-paypal: "\f1ed"; -$fa-var-pencil: "\f040"; -$fa-var-pencil-square: "\f14b"; -$fa-var-pencil-square-o: "\f044"; -$fa-var-percent: "\f295"; -$fa-var-phone: "\f095"; -$fa-var-phone-square: "\f098"; -$fa-var-photo: "\f03e"; -$fa-var-picture-o: "\f03e"; -$fa-var-pie-chart: "\f200"; -$fa-var-pied-piper: "\f2ae"; -$fa-var-pied-piper-alt: "\f1a8"; -$fa-var-pied-piper-pp: "\f1a7"; -$fa-var-pinterest: "\f0d2"; -$fa-var-pinterest-p: "\f231"; -$fa-var-pinterest-square: "\f0d3"; -$fa-var-plane: "\f072"; -$fa-var-play: "\f04b"; -$fa-var-play-circle: "\f144"; -$fa-var-play-circle-o: "\f01d"; -$fa-var-plug: "\f1e6"; -$fa-var-plus: "\f067"; -$fa-var-plus-circle: "\f055"; -$fa-var-plus-square: "\f0fe"; -$fa-var-plus-square-o: "\f196"; -$fa-var-podcast: "\f2ce"; -$fa-var-power-off: "\f011"; -$fa-var-print: "\f02f"; -$fa-var-product-hunt: "\f288"; -$fa-var-puzzle-piece: "\f12e"; -$fa-var-qq: "\f1d6"; -$fa-var-qrcode: "\f029"; -$fa-var-question: "\f128"; -$fa-var-question-circle: "\f059"; -$fa-var-question-circle-o: "\f29c"; -$fa-var-quora: "\f2c4"; -$fa-var-quote-left: "\f10d"; -$fa-var-quote-right: "\f10e"; -$fa-var-ra: "\f1d0"; -$fa-var-random: "\f074"; -$fa-var-ravelry: "\f2d9"; -$fa-var-rebel: "\f1d0"; -$fa-var-recycle: "\f1b8"; -$fa-var-reddit: "\f1a1"; -$fa-var-reddit-alien: "\f281"; -$fa-var-reddit-square: "\f1a2"; -$fa-var-refresh: "\f021"; -$fa-var-registered: "\f25d"; -$fa-var-remove: "\f00d"; -$fa-var-renren: "\f18b"; -$fa-var-reorder: "\f0c9"; -$fa-var-repeat: "\f01e"; -$fa-var-reply: "\f112"; -$fa-var-reply-all: "\f122"; -$fa-var-resistance: "\f1d0"; -$fa-var-retweet: "\f079"; -$fa-var-rmb: "\f157"; -$fa-var-road: "\f018"; -$fa-var-rocket: "\f135"; -$fa-var-rotate-left: "\f0e2"; -$fa-var-rotate-right: "\f01e"; -$fa-var-rouble: "\f158"; -$fa-var-rss: "\f09e"; -$fa-var-rss-square: "\f143"; -$fa-var-rub: "\f158"; -$fa-var-ruble: "\f158"; -$fa-var-rupee: "\f156"; -$fa-var-s15: "\f2cd"; -$fa-var-safari: "\f267"; -$fa-var-save: "\f0c7"; -$fa-var-scissors: "\f0c4"; -$fa-var-scribd: "\f28a"; -$fa-var-search: "\f002"; -$fa-var-search-minus: "\f010"; -$fa-var-search-plus: "\f00e"; -$fa-var-sellsy: "\f213"; -$fa-var-send: "\f1d8"; -$fa-var-send-o: "\f1d9"; -$fa-var-server: "\f233"; -$fa-var-share: "\f064"; -$fa-var-share-alt: "\f1e0"; -$fa-var-share-alt-square: "\f1e1"; -$fa-var-share-square: "\f14d"; -$fa-var-share-square-o: "\f045"; -$fa-var-shekel: "\f20b"; -$fa-var-sheqel: "\f20b"; -$fa-var-shield: "\f132"; -$fa-var-ship: "\f21a"; -$fa-var-shirtsinbulk: "\f214"; -$fa-var-shopping-bag: "\f290"; -$fa-var-shopping-basket: "\f291"; -$fa-var-shopping-cart: "\f07a"; -$fa-var-shower: "\f2cc"; -$fa-var-sign-in: "\f090"; -$fa-var-sign-language: "\f2a7"; -$fa-var-sign-out: "\f08b"; -$fa-var-signal: "\f012"; -$fa-var-signing: "\f2a7"; -$fa-var-simplybuilt: "\f215"; -$fa-var-sitemap: "\f0e8"; -$fa-var-skyatlas: "\f216"; -$fa-var-skype: "\f17e"; -$fa-var-slack: "\f198"; -$fa-var-sliders: "\f1de"; -$fa-var-slideshare: "\f1e7"; -$fa-var-smile-o: "\f118"; -$fa-var-snapchat: "\f2ab"; -$fa-var-snapchat-ghost: "\f2ac"; -$fa-var-snapchat-square: "\f2ad"; -$fa-var-snowflake-o: "\f2dc"; -$fa-var-soccer-ball-o: "\f1e3"; -$fa-var-sort: "\f0dc"; -$fa-var-sort-alpha-asc: "\f15d"; -$fa-var-sort-alpha-desc: "\f15e"; -$fa-var-sort-amount-asc: "\f160"; -$fa-var-sort-amount-desc: "\f161"; -$fa-var-sort-asc: "\f0de"; -$fa-var-sort-desc: "\f0dd"; -$fa-var-sort-down: "\f0dd"; -$fa-var-sort-numeric-asc: "\f162"; -$fa-var-sort-numeric-desc: "\f163"; -$fa-var-sort-up: "\f0de"; -$fa-var-soundcloud: "\f1be"; -$fa-var-space-shuttle: "\f197"; -$fa-var-spinner: "\f110"; -$fa-var-spoon: "\f1b1"; -$fa-var-spotify: "\f1bc"; -$fa-var-square: "\f0c8"; -$fa-var-square-o: "\f096"; -$fa-var-stack-exchange: "\f18d"; -$fa-var-stack-overflow: "\f16c"; -$fa-var-star: "\f005"; -$fa-var-star-half: "\f089"; -$fa-var-star-half-empty: "\f123"; -$fa-var-star-half-full: "\f123"; -$fa-var-star-half-o: "\f123"; -$fa-var-star-o: "\f006"; -$fa-var-steam: "\f1b6"; -$fa-var-steam-square: "\f1b7"; -$fa-var-step-backward: "\f048"; -$fa-var-step-forward: "\f051"; -$fa-var-stethoscope: "\f0f1"; -$fa-var-sticky-note: "\f249"; -$fa-var-sticky-note-o: "\f24a"; -$fa-var-stop: "\f04d"; -$fa-var-stop-circle: "\f28d"; -$fa-var-stop-circle-o: "\f28e"; -$fa-var-street-view: "\f21d"; -$fa-var-strikethrough: "\f0cc"; -$fa-var-stumbleupon: "\f1a4"; -$fa-var-stumbleupon-circle: "\f1a3"; -$fa-var-subscript: "\f12c"; -$fa-var-subway: "\f239"; -$fa-var-suitcase: "\f0f2"; -$fa-var-sun-o: "\f185"; -$fa-var-superpowers: "\f2dd"; -$fa-var-superscript: "\f12b"; -$fa-var-support: "\f1cd"; -$fa-var-table: "\f0ce"; -$fa-var-tablet: "\f10a"; -$fa-var-tachometer: "\f0e4"; -$fa-var-tag: "\f02b"; -$fa-var-tags: "\f02c"; -$fa-var-tasks: "\f0ae"; -$fa-var-taxi: "\f1ba"; -$fa-var-telegram: "\f2c6"; -$fa-var-television: "\f26c"; -$fa-var-tencent-weibo: "\f1d5"; -$fa-var-terminal: "\f120"; -$fa-var-text-height: "\f034"; -$fa-var-text-width: "\f035"; -$fa-var-th: "\f00a"; -$fa-var-th-large: "\f009"; -$fa-var-th-list: "\f00b"; -$fa-var-themeisle: "\f2b2"; -$fa-var-thermometer: "\f2c7"; -$fa-var-thermometer-0: "\f2cb"; -$fa-var-thermometer-1: "\f2ca"; -$fa-var-thermometer-2: "\f2c9"; -$fa-var-thermometer-3: "\f2c8"; -$fa-var-thermometer-4: "\f2c7"; -$fa-var-thermometer-empty: "\f2cb"; -$fa-var-thermometer-full: "\f2c7"; -$fa-var-thermometer-half: "\f2c9"; -$fa-var-thermometer-quarter: "\f2ca"; -$fa-var-thermometer-three-quarters: "\f2c8"; -$fa-var-thumb-tack: "\f08d"; -$fa-var-thumbs-down: "\f165"; -$fa-var-thumbs-o-down: "\f088"; -$fa-var-thumbs-o-up: "\f087"; -$fa-var-thumbs-up: "\f164"; -$fa-var-ticket: "\f145"; -$fa-var-times: "\f00d"; -$fa-var-times-circle: "\f057"; -$fa-var-times-circle-o: "\f05c"; -$fa-var-times-rectangle: "\f2d3"; -$fa-var-times-rectangle-o: "\f2d4"; -$fa-var-tint: "\f043"; -$fa-var-toggle-down: "\f150"; -$fa-var-toggle-left: "\f191"; -$fa-var-toggle-off: "\f204"; -$fa-var-toggle-on: "\f205"; -$fa-var-toggle-right: "\f152"; -$fa-var-toggle-up: "\f151"; -$fa-var-trademark: "\f25c"; -$fa-var-train: "\f238"; -$fa-var-transgender: "\f224"; -$fa-var-transgender-alt: "\f225"; -$fa-var-trash: "\f1f8"; -$fa-var-trash-o: "\f014"; -$fa-var-tree: "\f1bb"; -$fa-var-trello: "\f181"; -$fa-var-tripadvisor: "\f262"; -$fa-var-trophy: "\f091"; -$fa-var-truck: "\f0d1"; -$fa-var-try: "\f195"; -$fa-var-tty: "\f1e4"; -$fa-var-tumblr: "\f173"; -$fa-var-tumblr-square: "\f174"; -$fa-var-turkish-lira: "\f195"; -$fa-var-tv: "\f26c"; -$fa-var-twitch: "\f1e8"; -$fa-var-twitter: "\f099"; -$fa-var-twitter-square: "\f081"; -$fa-var-umbrella: "\f0e9"; -$fa-var-underline: "\f0cd"; -$fa-var-undo: "\f0e2"; -$fa-var-universal-access: "\f29a"; -$fa-var-university: "\f19c"; -$fa-var-unlink: "\f127"; -$fa-var-unlock: "\f09c"; -$fa-var-unlock-alt: "\f13e"; -$fa-var-unsorted: "\f0dc"; -$fa-var-upload: "\f093"; -$fa-var-usb: "\f287"; -$fa-var-usd: "\f155"; -$fa-var-user: "\f007"; -$fa-var-user-circle: "\f2bd"; -$fa-var-user-circle-o: "\f2be"; -$fa-var-user-md: "\f0f0"; -$fa-var-user-o: "\f2c0"; -$fa-var-user-plus: "\f234"; -$fa-var-user-secret: "\f21b"; -$fa-var-user-times: "\f235"; -$fa-var-users: "\f0c0"; -$fa-var-vcard: "\f2bb"; -$fa-var-vcard-o: "\f2bc"; -$fa-var-venus: "\f221"; -$fa-var-venus-double: "\f226"; -$fa-var-venus-mars: "\f228"; -$fa-var-viacoin: "\f237"; -$fa-var-viadeo: "\f2a9"; -$fa-var-viadeo-square: "\f2aa"; -$fa-var-video-camera: "\f03d"; -$fa-var-vimeo: "\f27d"; -$fa-var-vimeo-square: "\f194"; -$fa-var-vine: "\f1ca"; -$fa-var-vk: "\f189"; -$fa-var-volume-control-phone: "\f2a0"; -$fa-var-volume-down: "\f027"; -$fa-var-volume-off: "\f026"; -$fa-var-volume-up: "\f028"; -$fa-var-warning: "\f071"; -$fa-var-wechat: "\f1d7"; -$fa-var-weibo: "\f18a"; -$fa-var-weixin: "\f1d7"; -$fa-var-whatsapp: "\f232"; -$fa-var-wheelchair: "\f193"; -$fa-var-wheelchair-alt: "\f29b"; -$fa-var-wifi: "\f1eb"; -$fa-var-wikipedia-w: "\f266"; -$fa-var-window-close: "\f2d3"; -$fa-var-window-close-o: "\f2d4"; -$fa-var-window-maximize: "\f2d0"; -$fa-var-window-minimize: "\f2d1"; -$fa-var-window-restore: "\f2d2"; -$fa-var-windows: "\f17a"; -$fa-var-won: "\f159"; -$fa-var-wordpress: "\f19a"; -$fa-var-wpbeginner: "\f297"; -$fa-var-wpexplorer: "\f2de"; -$fa-var-wpforms: "\f298"; -$fa-var-wrench: "\f0ad"; -$fa-var-xing: "\f168"; -$fa-var-xing-square: "\f169"; -$fa-var-y-combinator: "\f23b"; -$fa-var-y-combinator-square: "\f1d4"; -$fa-var-yahoo: "\f19e"; -$fa-var-yc: "\f23b"; -$fa-var-yc-square: "\f1d4"; -$fa-var-yelp: "\f1e9"; -$fa-var-yen: "\f157"; -$fa-var-yoast: "\f2b1"; -$fa-var-youtube: "\f167"; -$fa-var-youtube-play: "\f16a"; -$fa-var-youtube-square: "\f166"; - diff --git a/web/static/assets/dist/font-awesome/scss/font-awesome.scss b/web/static/assets/dist/font-awesome/scss/font-awesome.scss deleted file mode 100644 index f1c83aa..0000000 --- a/web/static/assets/dist/font-awesome/scss/font-awesome.scss +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables"; -@import "mixins"; -@import "path"; -@import "core"; -@import "larger"; -@import "fixed-width"; -@import "list"; -@import "bordered-pulled"; -@import "animated"; -@import "rotated-flipped"; -@import "stacked"; -@import "icons"; -@import "screen-reader"; diff --git a/web/static/assets/dist/index.js b/web/static/assets/dist/index.js deleted file mode 100644 index df4d3a2..0000000 --- a/web/static/assets/dist/index.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports","knockout","hasher","crossroads","nprogress","stairs"],function(e,n,t,r,o,a,i){"use strict";n.__esModule=!0;var s=function(){function e(){this.Page=t.observable({pattern:"",component:""}),o.normalizeFn=o.NORM_AS_OBJECT,this.addPage(":rest*:","mode",-1/0),this.addPage("settings","settings"),this.addPage("firmware","firmware"),r.initialized.add(function(e){return o.parse(e)}),r.changed.add(function(e){return o.parse(e)}),r.init(),a.configure({parent:"#progress"});var e=i.Stairs.instance(),n=!0;this.progress=t.computed(function(){e.Saving()?a.start():n&&e.Loading()?a.start():(a.done(),n=!1)})}return e.prototype.addPage=function(e,n,r){var a=this,i={pattern:e,component:"page-"+n};t.components.register(i.component,{require:"components/"+i.component}),o.addRoute(e,function(){a.Page(i)},r)},e}();t.applyBindings(new s)}); \ No newline at end of file diff --git a/web/static/assets/dist/log.js b/web/static/assets/dist/log.js deleted file mode 100644 index 1a2a794..0000000 --- a/web/static/assets/dist/log.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports"],function(e,o){"use strict";o.__esModule=!0;var n;!function(e){e[e.None=0]="None",e[e.Fatal=1]="Fatal",e[e.Error=2]="Error",e[e.Warning=3]="Warning",e[e.Info=4]="Info",e[e.Verbose=5]="Verbose"}(n=o.LogLevel||(o.LogLevel={}));var l=function(){function e(){}return e.fatal=function(e,o){this.Level>=n.Fatal&&this.log(e,o)},e.error=function(e,o){this.Level>=n.Error&&this.log(e,o)},e.warning=function(e,o){this.Level>=n.Warning&&this.log(e,o)},e.info=function(e,o){this.Level>=n.Info&&this.log(e,o)},e.verbose=function(e,o){this.Level>=n.Verbose&&this.log(e,o)},e.log=function(e,o){switch(typeof o){case"undefined":console.log(e+": undefined");break;case"boolean":case"number":case"string":case"symbol":console.log(e+": "+o);break;default:null===o?console.log(e+": null"):(console.log(e+": (object)"),console.log(o))}},e}();l.Level=n.Verbose,o.Log=l}); \ No newline at end of file diff --git a/web/static/assets/dist/router.js b/web/static/assets/dist/router.js deleted file mode 100644 index 5e68d7b..0000000 --- a/web/static/assets/dist/router.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports","hasher","knockout","crossroads"],function(n,r,e,t,o){"use strict";r.__esModule=!0;var u=function(){function n(n){var r=this;this.CurrentRoute=t.observable(null),t.utils.arrayForEach(n.routes,function(n){o.addRoute(n.url,function(e){console.log("changing route"),r.CurrentRoute({url:n.url,component:n.component,params:t.utils.extend(e,n.params)})})}),o.normalizeFn=o.NORM_AS_OBJECT,e.initialized.add(function(n){return o.parse(n)}),e.changed.add(function(n){return o.parse(n)}),e.init()}return n}();r.Router=u}); \ No newline at end of file diff --git a/web/static/assets/dist/stairs.js b/web/static/assets/dist/stairs.js deleted file mode 100644 index 99e6c62..0000000 --- a/web/static/assets/dist/stairs.js +++ /dev/null @@ -1 +0,0 @@ -define(["require","exports","knockout","log"],function(e,t,n,i){"use strict";t.__esModule=!0;var r=null,o=function(){function e(){this.Brightness=n.observable(0),this.Ease=n.observable(!1)}return e.prototype.read=function(e){this.Brightness(e.brightness)},e}();t.StairsStaticMode=o;var a=function(){function e(){this.Brightness=n.observableArray([])}return e.prototype.init=function(e){for(var t=[],i=0;i -var bowerBase = '../../bower_components/'; - -var config: RequireConfig = { - baseUrl: "assets/dist/", - shim: { - 'bootstrap': { - deps: ['jquery', 'tether'], - exports: 'Bootstrap' - } - }, - paths: { - crossroads: bowerBase + 'crossroads/dist/crossroads.min', - hasher: bowerBase + 'hasher/dist/js/hasher.min', - jquery: bowerBase + 'jquery/dist/jquery.min', - knockout: bowerBase + 'knockout/dist/knockout', - signals: bowerBase + 'js-signals/dist/signals.min', - text: bowerBase + 'text/text', - bootstrap: bowerBase + 'bootstrap/dist/js/bootstrap.min', - tether: bowerBase + 'tether/dist/js/tether.min', - nprogress: bowerBase + 'nprogress/nprogress' - } -}; - -// No definition in the typing -(config).wrapShim = true; - -requirejs.config(config); - -(window).Tether = require(['tether'], function() -{ - require(['bootstrap', 'index']); -}); \ No newline at end of file diff --git a/web/static/assets/ts/components/page-firmware.html b/web/static/assets/ts/components/page-firmware.html deleted file mode 100644 index 53a9482..0000000 --- a/web/static/assets/ts/components/page-firmware.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
-
- -
-
-
diff --git a/web/static/assets/ts/components/page-firmware.ts b/web/static/assets/ts/components/page-firmware.ts deleted file mode 100644 index cb96579..0000000 --- a/web/static/assets/ts/components/page-firmware.ts +++ /dev/null @@ -1,19 +0,0 @@ -import template = require('text!./page-firmware.html'); -import ko = require('knockout'); -import stairs = require('stairs'); - -class FirmwareController -{ -// public Stairs = stairs.Stairs.instance(); - public Host = ko.observable(location.hostname); - public Port = ko.observable(location.port); - public Path = ko.observable("/updateFirmware"); - - - public updateFirmware = () => - { - - } -} - -export = { viewModel: FirmwareController, template: template }; \ No newline at end of file diff --git a/web/static/assets/ts/components/page-mode.html b/web/static/assets/ts/components/page-mode.html deleted file mode 100644 index 0cab795..0000000 --- a/web/static/assets/ts/components/page-mode.html +++ /dev/null @@ -1,71 +0,0 @@ -
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
Brightness
-
-
-
-
- -
- -
-
-
Step
-
Value
-
- -
-
-
-
-
-
-
-
-
- -
-
-
Interval
-
-
-
- -
-
Brightness
-
-
-
-
- - \ No newline at end of file diff --git a/web/static/assets/ts/components/page-mode.ts b/web/static/assets/ts/components/page-mode.ts deleted file mode 100644 index 3196167..0000000 --- a/web/static/assets/ts/components/page-mode.ts +++ /dev/null @@ -1,11 +0,0 @@ -import template = require('text!./page-mode.html'); -import ko = require('knockout'); -import stairs = require('stairs'); - -class ModeController -{ - public StairsMode = stairs.StairsMode; - public Stairs = stairs.Stairs.instance(); -} - -export = { viewModel: ModeController, template: template }; \ No newline at end of file diff --git a/web/static/assets/ts/components/page-settings.html b/web/static/assets/ts/components/page-settings.html deleted file mode 100644 index 65c8535..0000000 --- a/web/static/assets/ts/components/page-settings.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
- -
- -
-
Step
-
Start (min. 0)
-
End (max. 4095)
-
- -
-
-
-
-
-
-
- - -
\ No newline at end of file diff --git a/web/static/assets/ts/components/page-settings.ts b/web/static/assets/ts/components/page-settings.ts deleted file mode 100644 index ac069b1..0000000 --- a/web/static/assets/ts/components/page-settings.ts +++ /dev/null @@ -1,24 +0,0 @@ -import template = require('text!./page-settings.html'); -import ko = require('knockout'); -import stairs = require('stairs'); - -class SettingsController -{ - public Stairs = stairs.Stairs.instance(); - - - public resetRanges = (): boolean => - { - this.Stairs.Range.Values(this.Stairs.Range.Values().map((item: stairs.StairsRangeValue): stairs.StairsRangeValue => - { - var value = new stairs.StairsRangeValue(); - value.Start(0); - value.End(4095); - return value; - })); - - return false; - } -} - -export = { viewModel: SettingsController, template: template }; \ No newline at end of file diff --git a/web/static/assets/ts/index.ts b/web/static/assets/ts/index.ts deleted file mode 100644 index 45bc8a6..0000000 --- a/web/static/assets/ts/index.ts +++ /dev/null @@ -1,73 +0,0 @@ -import ko = require('knockout'); -import hasher = require('hasher'); -import crossroads = require('crossroads'); -import NProgress = require('nprogress'); -import stairs = require('stairs'); - - -export interface IPage -{ - pattern: string; - component: string; -} - - - -class IndexController -{ - public Page = ko.observable({ pattern: '', component: '' }); - - private progress: KnockoutComputed; - - - constructor() - { - crossroads.normalizeFn = crossroads.NORM_AS_OBJECT; - - this.addPage(':rest*:', 'mode', -Infinity); - this.addPage('settings', 'settings'); - this.addPage('firmware', 'firmware'); - - hasher.initialized.add((hash: string) => crossroads.parse(hash)); - hasher.changed.add((hash: string) => crossroads.parse(hash)); - hasher.init(); - - NProgress.configure({ - parent: '#progress' - }); - - var instance = stairs.Stairs.instance(); - var initialProgress = true; - - this.progress = ko.computed(() => - { - if (instance.Saving()) - NProgress.start() - else - { - // Only show the progress bar initially, not for later refreshes - if (initialProgress && instance.Loading()) - NProgress.start(); - else - { - NProgress.done(); - initialProgress = false; - } - } - }); - } - - - private addPage(pattern: string, pageName: string, priority?: number): void - { - var page: IPage = { pattern: pattern, component: 'page-' + pageName }; - ko.components.register(page.component, { require: 'components/' + page.component }); - crossroads.addRoute(pattern, () => - { - this.Page(page); - }, priority); - } -} - - -ko.applyBindings(new IndexController()); \ No newline at end of file diff --git a/web/static/assets/ts/log.ts b/web/static/assets/ts/log.ts deleted file mode 100644 index fb2e430..0000000 --- a/web/static/assets/ts/log.ts +++ /dev/null @@ -1,79 +0,0 @@ -export enum LogLevel -{ - None, - Fatal, - Error, - Warning, - Info, - Verbose -} - - -export class Log -{ - public static Level = LogLevel.Verbose; - - - public static fatal(context: string, message: any): void - { - if (this.Level >= LogLevel.Fatal) - this.log(context, message); - } - - - public static error(context: string, message: any): void - { - if (this.Level >= LogLevel.Error) - this.log(context, message); - } - - - public static warning(context: string, message: any): void - { - if (this.Level >= LogLevel.Warning) - this.log(context, message); - } - - - public static info(context: string, message: any): void - { - if (this.Level >= LogLevel.Info) - this.log(context, message); - } - - - public static verbose(context: string, message: any): void - { - if (this.Level >= LogLevel.Verbose) - this.log(context, message); - } - - - private static log(context: string, message: any): void - { - switch (typeof(message)) - { - case 'undefined': - console.log(context + ': undefined'); - break; - - case 'boolean': - case 'number': - case 'string': - case 'symbol': - console.log(context + ': ' + message); - break; - - default: - if (message === null) - console.log(context + ': null'); - else - { - console.log(context + ': (object)'); - console.log(message); - } - - break; - } - } -} \ No newline at end of file diff --git a/web/static/assets/ts/stairs.ts b/web/static/assets/ts/stairs.ts deleted file mode 100644 index cb60384..0000000 --- a/web/static/assets/ts/stairs.ts +++ /dev/null @@ -1,389 +0,0 @@ -import jquery = require('jquery'); -import ko = require('knockout'); -import { Log } from 'log'; - - -var instance: Stairs = null; - - -export class StairsStaticMode -{ - public Brightness = ko.observable(0); - public Ease = ko.observable(false); - - public read(data: any): void - { - this.Brightness(data.brightness); - } -} - -export interface IStairsCustomBrightness -{ - value: KnockoutObservable; -} - -export class StairsCustomMode -{ - public Brightness = ko.observableArray([]); - - public init(stepCount: number): void - { - // Each item is an object containing an observable; we can't - // add the observable directly otherwise the foreach template - // will unwrap it before we can attach it to the range input. - var values: Array = []; - for (var index = 0; index < stepCount; index++) - values.push({ value: ko.observable(0) }); - - this.Brightness(values); - } - - public read(data: any): void - { - var brightness = data.brightness.map((item: number): IStairsCustomBrightness => - { - return { value: ko.observable(item) }; - }); - - brightness.reverse(); - this.Brightness(brightness); - } -} - -export class StairsAlternateMode -{ - public Interval = ko.observable(500); - public Brightness = ko.observable(0); - - public read(data: any): void - { - this.Interval(data.interval); - this.Brightness(data.brightness); - } -} - - -export enum StairsMode -{ - Unknown = 0, - Static = 1, - Custom = 2, - Alternate = 3 -} - -export class StairsModeParameters -{ - public Static = new StairsStaticMode(); - public Custom = new StairsCustomMode(); - public Alternate = new StairsAlternateMode(); - - public Current = ko.observable(StairsMode.Unknown); - - - public read(data: any): void - { - switch (this.Current()) - { - case StairsMode.Static: this.Static.read(data); break; - case StairsMode.Custom: this.Custom.read(data); break; - case StairsMode.Alternate: this.Alternate.read(data); break; - } - } -} - - -export class StairsRangeValue -{ - public Start = ko.observable(0); - public End = ko.observable(4095); -} - - -export class StairsRange -{ - public UseScaling = ko.observable(false); - public Values = ko.observableArray([]); - - public read(data: any): void - { - this.UseScaling(data.useScaling); - - var values = data.values.map((item: any): StairsRangeValue => - { - var value = new StairsRangeValue(); - value.Start(item.start); - value.End(item.end); - - return value; - }); - - values.reverse(); - this.Values(values); - } -} - - -export class Stairs -{ - public Loading = ko.observable(false); - public SavingMode = ko.observable(false); - public SavingSettings = ko.observable(false); - public Saving = ko.pureComputed(() => - { - return this.SavingMode() || this.SavingSettings(); - }); - - public Mode = new StairsModeParameters(); - public Range = new StairsRange(); - - private pingTimer: number = null; - private pingRequest: JQueryXHR = null; - - private updatingFromServer = true; - private updateModeTimeout: number = null; - private updateRangeTimeout: number = null; - - - public static instance(): Stairs - { - if (instance == null) - instance = new Stairs(); - - return instance; - } - - - constructor() - { - this.ping(); - } - - - public ping(): void - { - if (this.pingRequest !== null) - { - Log.verbose('Stairs.ping', 'Ping request already running, skipping'); - return; - } - - if (this.pingTimer !== null) - { - clearTimeout(this.pingTimer); - this.pingTimer = null; - } - - if (this.Loading() || this.Saving()) - { - this.pingTimer = setTimeout(() => this.ping(), 5000); - return; - } - - Log.verbose('Stairs.ping', 'Starting Ping request'); - this.updatingFromServer = true; - this.Loading(true); - - this.pingRequest = $.ajax({ - url: '/ping', - dataType: 'json', - cache: false - }); - - this.pingRequest.done((data: any) => - { - Log.verbose('Stairs.ping', data); - - this.Mode.Custom.init(data.stepCount); - $.when(this.getMode(), this.getRange()) - .done(() => this.pingComplete(true)) - .fail(() => this.pingComplete(false)); - }); - - this.pingRequest.fail(() => - { - Log.warning('Stairs.ping', 'Ping failed'); - this.pingComplete(true); - }); - } - - - private pingComplete(success: boolean) - { - this.pingRequest = null; - - if (success) - //this.pingTimer = setTimeout(() => this.ping(), 5000); - {} - else - this.pingTimer = setTimeout(() => this.ping(), 5000); - - if (success) - { - this.Loading(false); - this.updatingFromServer = false; - } - } - - - private getMode(): JQueryPromise - { - Log.verbose('Stairs.getMode', 'Requesting Mode'); - - var request = $.ajax({ - url: '/getMode', - dataType: 'json', - cache: false - }); - - request.done((response) => - { - Log.verbose('Stairs.getMode', response); - - this.Mode.Current(response.mode); - this.Mode.read(response.data); - }); - - return request; - } - - - private getRange(): JQueryPromise - { - Log.verbose('Stairs.getRange', 'Requesting Range configuration'); - - var request = $.ajax({ - url: '/getRange', - dataType: 'json', - cache: false - }); - - request.done((response) => - { - Log.verbose('Stairs.getRange', response); - - this.Range.read(response); - }); - - return request; - } - - - private updateMode = ko.computed(() => - { - if (this.Loading() || this.SavingMode.peek()) return; - - var url = '/setMode/'; - switch (this.Mode.Current()) - { - case StairsMode.Static: - url += 'Static?brightness=' + encodeURIComponent(this.Mode.Static.Brightness().toString()); - break; - - case StairsMode.Custom: - var values = this.Mode.Custom.Brightness().map((item: IStairsCustomBrightness) => { return item.value(); }); - values.reverse(); - url += 'Custom?brightness=' + encodeURIComponent(values.join()); - break; - - case StairsMode.Alternate: - url += 'Alternate?interval=' + encodeURIComponent(this.Mode.Alternate.Interval().toString()) + - '&brightness=' + encodeURIComponent(this.Mode.Alternate.Brightness().toString()); - break; - -/* - case 'Slide': - url += '?interval=' + encodeURIComponent(this.slide.interval()) + - '&brightness=' + encodeURIComponent(this.slide.brightness()) + - '&direction=' + encodeURIComponent(this.slide.direction()) + - '&fadeOutTime=' + encodeURIComponent(this.slide.fadeOutTime()); - break; -*/ - } - - - // Exit after checking all the parameters, so the observers - // are properly subscribed - if (this.updatingFromServer) return; - - if (this.updateModeTimeout !== null) - { - clearTimeout(this.updateModeTimeout); - this.updateModeTimeout = null; - } - - this.updateModeTimeout = setTimeout(() => - { - Log.info("Stairs.updateMode", url); - - // TODO retry on failure - this.SavingMode(true); - - $.ajax( - { - url: url, - dataType: 'json', - cache: false - }) - .always(() => - { - this.SavingMode(false); - }); - - clearTimeout(this.updateModeTimeout); - this.updateModeTimeout = null; - }, 200); - - return true; - }); - - - private updateSettings = ko.computed(() => - { - if (this.Loading() || this.SavingSettings.peek()) return; - - var url = '/setRange?useScaling=' + this.Range.UseScaling().toString(); - - var start = this.Range.Values().map((item: StairsRangeValue): number => { return item.Start(); }); - var end = this.Range.Values().map((item: StairsRangeValue): number => { return item.End(); }); - - start.reverse(); - end.reverse(); - - url += '&start=' + encodeURIComponent(start.join()); - url += '&end=' + encodeURIComponent(end.join()); - - // Exit after checking all the parameters, so the observers - // are properly subscribed - if (this.updatingFromServer) return; - - if (this.updateRangeTimeout !== null) - { - clearTimeout(this.updateRangeTimeout); - this.updateRangeTimeout = null; - } - - this.updateRangeTimeout = setTimeout(() => - { - Log.info("Stairs.updateSettings", url); - - // TODO retry on failure - this.SavingSettings(true); - - $.ajax( - { - url: url, - dataType: 'json', - cache: false - }) - .always(() => - { - this.SavingSettings(false); - }); - - clearTimeout(this.updateRangeTimeout); - this.updateRangeTimeout = null; - }, 200); - - return true; - }); -} \ No newline at end of file diff --git a/web/static/assets/ts/text.ts b/web/static/assets/ts/text.ts deleted file mode 100644 index c3bade7..0000000 --- a/web/static/assets/ts/text.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module 'text!*' { - var _: string; - export default _; -} \ No newline at end of file diff --git a/web/static/index.html b/web/static/index.html deleted file mode 100644 index 9914776..0000000 --- a/web/static/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - Stairs frontend - - - - - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
- - \ No newline at end of file diff --git a/web/typings.json b/web/typings.json deleted file mode 100644 index 3d66f59..0000000 --- a/web/typings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "dependencies": { - "crossroads": "registry:dt/crossroads#0.0.0+20160628004037", - "hasher": "registry:dt/hasher#0.0.0+20170105185230", - "knockout": "registry:npm/knockout#3.4.0+20160516171930", - "requirejs": "registry:npm/requirejs#2.2.0+20160319062357" - } -}