diff --git a/php/src/app/Console/Commands/ProcessArtistQueue.php b/php/src/app/Console/Commands/ProcessArtistQueue.php index 2f020d4..2eb6ef1 100644 --- a/php/src/app/Console/Commands/ProcessArtistQueue.php +++ b/php/src/app/Console/Commands/ProcessArtistQueue.php @@ -27,11 +27,16 @@ class ProcessArtistQueue extends Command */ public function handle() { + // This queue will prompt the scraping of all artist albums, mark done when complete $artists = ArtistQueue::where('state', 'pending')->get(); $bar = new ProgressBar($this->output, count($artists)); $bar->start(); foreach ($artists as $artist) { + $artist->state = 'in_progress'; + $artist->save(); $artist->process_artist(); + $artist->state = 'done'; + $artist->save(); $bar->advance(); } } diff --git a/php/src/app/Console/Kernel.php b/php/src/app/Console/Kernel.php new file mode 100644 index 0000000..9f282a3 --- /dev/null +++ b/php/src/app/Console/Kernel.php @@ -0,0 +1,20 @@ +command('app:process-artist-queue')->everyMinute()->withoutOverlapping(); + } +} diff --git a/python/app.py b/python/app.py index e3f88cb..3d9019e 100644 --- a/python/app.py +++ b/python/app.py @@ -1,6 +1,5 @@ import json from apscheduler.schedulers.background import BackgroundScheduler -from database import Model from flask import Flask, render_template from redis import Redis from utils.download import download_album @@ -9,7 +8,6 @@ from utils.processor import process_download app = Flask(__name__) redis = Redis(host='redis', port=6379) -Album = Model('album') def process_downloads(): @@ -31,18 +29,10 @@ cron.add_job(process_downloads, 'interval', minutes=1) cron.start() -@app.route('/') -def index(): - # redis.incr('hits') - # counter = 'This Compose/Flask demo has been viewed %s time(s).' % redis.get('hits') - - return render_template('base.html') - - -@app.route('/api/v1/get/artist/') +@app.route('/api/v1/process/album') def get_artist(path): """ - Process for the requested Artist + Process for the requested Album :param path: The Artist to get files for :return: a status """ diff --git a/python/const.py b/python/const.py deleted file mode 100644 index dafbe7e..0000000 --- a/python/const.py +++ /dev/null @@ -1,20 +0,0 @@ -import os -from redis import Redis -redis = Redis(host='redis', port=6379) -BASE_URL = 'https://www.youtube.com' -QUERY_URL = BASE_URL + '/results?search_query=' - -CWD = os.getcwd() -ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) -MEDIA_FOLDER = os.path.join(ROOT_DIR, 'music') - -ALBUM_CONTAINER_ID = 'shelf-container' -ALBUM_CONTAINER_CLASS = 'ytd-search-refinement-card-renderer' -ALBUM_CONTAINER_ITEMS_XPATH = '/html/body/ytd-app/div[1]/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/ytd-secondary-search-container-renderer/div/ytd-universal-watch-card-renderer/div[4]/ytd-watch-card-section-sequence-renderer[2]/div/ytd-horizontal-card-list-renderer/div[2]/div[2]' -# ALBUM_CONTAINER_FULL_XPATH = '/html/body/ytd-app/div[1]/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/ytd-secondary-search-container-renderer/div/ytd-universal-watch-card-renderer/div[4]/ytd-watch-card-section-sequence-renderer[2]/div' -ALBUM_CONTAINER_FULL_XPATH = '/html/body/ytd-app/div[1]/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/ytd-secondary-search-container-renderer/div/ytd-universal-watch-card-renderer/div[4]/ytd-watch-card-section-sequence-renderer[2]/div/ytd-horizontal-card-list-renderer/div[2]' - -BTN_RIGHT_FULL_XPATH = '/html/body/ytd-app/div[1]/ytd-page-manager/ytd-search/div[1]/ytd-two-column-search-results-renderer/ytd-secondary-search-container-renderer/div/ytd-universal-watch-card-renderer/div[4]/ytd-watch-card-section-sequence-renderer[2]/div/ytd-horizontal-card-list-renderer/div[2]/div[3]/div[2]/ytd-button-renderer/yt-button-shape/button' -click_script = """ -document.evaluate('%s', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click(); -""" % BTN_RIGHT_FULL_XPATH diff --git a/python/database.py b/python/database.py deleted file mode 100644 index 2a738d9..0000000 --- a/python/database.py +++ /dev/null @@ -1,89 +0,0 @@ -import json -import operator as oprtr -from const import * -from pysondb import PysonDB - - -def evaluate_condition(record_field, operator, condition): - return operator(record_field, condition) - - -def evaluate_operator(op): - if op == '>': - op = oprtr.gt - elif op == '<': - op = oprtr.lt - elif op == '=': - op = oprtr.eq - elif op == '!=': - op = oprtr.ne - else: - raise UserWarning('Invalid Operator: %s' % op) - return op - - -class Model: - # TODO: Modify some of this to be wrapped into an ENV wrapper that gets loaded in when the server starts and creates - # class objects that can be manipulated easier by things like update_by_id - - def __init__(self, name): - self.env = PysonDB(CWD + '/database/%s.json' % name) - - def _search(self, records, params): - """ - Iterate through list of condition tuples and append results to a checklist that will evaluate at the end - ex params: [('name', '=', 'John'), ('zip', '!=', '12345')] - :param params: List of tuples - :return: Record to search recordset if True - """ - filtered_record_ids =[] - for record in records: - record_id = self.env.get_by_id(record) - checklist = [] - for param in params: - field = param[0] - operator = evaluate_operator(param[1]) - condition = param[2] - checklist.append(evaluate_condition(record_id[field], operator, condition)) - - passed = all(x for x in checklist) - if passed: - record_id.update({'id': record}) - filtered_record_ids.append(record_id) - - return filtered_record_ids - - def search(self, params): - """ - :param params: List of tuples that will be evaluated and return a total list of records - :return: None, List or Single record - """ - records = self.env.get_all() - record_ids = self._search(records, params) - if not record_ids: - record_ids = None - - return record_ids - - def read(self, record_id): - data = self.env.get_by_id(record_id) - return data - - def create(self, vals): - record = self.env.add(vals) - return record - - def create_many(self, record_list): - record_ids = self.env.add_many(record_list) - return record_ids - - def write(self, record_id, vals): - record = self.env.update_by_id(record_id, vals) - return record - - def unlink(self, record_id): - self.env.delete_by_id(record_id) - return True - - def purge(self): - self.env.purge() diff --git a/python/database/album.json b/python/database/album.json deleted file mode 100644 index 65fae68..0000000 --- a/python/database/album.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 2, - "keys": [ - "album", - "artist", - "cover", - "downloaded", - "downloading", - "link" - ], - "data": {} -} \ No newline at end of file diff --git a/python/dockerfiles/python.dockerfile b/python/dockerfiles/python.dockerfile index aab2881..3cae52e 100644 --- a/python/dockerfiles/python.dockerfile +++ b/python/dockerfiles/python.dockerfile @@ -1,20 +1,10 @@ FROM debian:bullseye-slim RUN apt update && apt upgrade -y -RUN apt install firefox-esr -y +RUN apt install ffmpeg -y RUN apt install curl python3-pip -y ADD . /code WORKDIR /code -# Geckodriver Install for Selenium -# RUN bash geckodriver-install.sh -#RUN json=$(curl -s https://api.github.com/repos/mozilla/geckodriver/releases/latest) -#RUN url=$(echo "$json" | jq -r '.assets[].browser_download_url | select(contains("linux64") and endswith("gz"))') -ARG url="https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-linux64.tar.gz" -RUN curl -s -L "$url" | tar -xz -RUN chmod +x geckodriver -RUN mv geckodriver /usr/local/bin -RUN export PATH=$PATH:/usr/local/bin/geckodriver - RUN pip3 install -r requirements.txt ENV FLASK_APP=app diff --git a/python/drivers/geckodriver-0.33.0/.cargo/config b/python/drivers/geckodriver-0.33.0/.cargo/config deleted file mode 100644 index 18086c8..0000000 --- a/python/drivers/geckodriver-0.33.0/.cargo/config +++ /dev/null @@ -1,3 +0,0 @@ -[target.i686-pc-windows-gnu] -linker = "i686-w64-mingw32-gcc" -rustflags = "-C panic=abort" diff --git a/python/drivers/geckodriver-0.33.0/CHANGES.md b/python/drivers/geckodriver-0.33.0/CHANGES.md deleted file mode 100644 index 3fb016a..0000000 --- a/python/drivers/geckodriver-0.33.0/CHANGES.md +++ /dev/null @@ -1,1831 +0,0 @@ - -# Change log - -All notable changes to this program are documented in this file. - -## 0.33.0 (2023-04-03, `a80e5fd61076`) - -### Known problems - -- _Startup hang with Firefox running in a container (e.g. snap, flatpak):_ - - When Firefox is packaged inside a container (like the default Firefox browser - shipped with Ubuntu 22.04), it may see a different filesystem to the host. - This can affect access to the generated profile directory, which may result - in a hang when starting Firefox. Workarounds are listed in the geckodriver - [usage documentation]. - -- _Potential hang with `moz:debuggerAddress` capability set to `true`:_ - - After enabling the site-isolation feature in Firefox with geckodriver 0.32.1 - some WebDriver clients like Selenium that use the Chrome DevTools Protocol (CDP) - by default for logging events could trigger a hang in Firefox's experimental CDP - implementation. The fix for this problem will be shipped with Firefox 112. - Until then the following Firefox preferences should be set: - - - `fission.bfcacheInParent: false` - - `fission.webContentIsolationStrategy: 0` - -### Added - -- Support for [Get Computed Label] and [Get Computed Role] - - The command [Get Computed Label] returns the accessibility label (sometimes - also referred to as Accessible Name), which is a short string that labels the - function of the control (e.g. the string "Comment" or "Sign In" on a button). - - The command [Get Computed Role] returns the reserved token value (in ARIA, - button, heading, etc.) that describes the type of control or content in the - element. - - Note that the minimum required Firefox version is 113.0. - -- Support for [Find Element From Shadow Root] and [Find Elements From Shadow Root] - - The commands allow a lookup of individual elements or collections of elements - within an open or closed Shadow DOM. All location strategies except `Tag name` and - `XPath selector` are currently supported. - - Note that the minimum required Firefox version is 113.0. - -### Changed - -- The Mozilla specific capability `moz:useNonSpecCompliantPointerOrigin` has been - marked as deprecated. Its removal is planned for the Firefox 116.0 release. - -## 0.32.2 (2023-02-08, `602aa16c20d4`) - -### Known problems - -- _Startup hang with Firefox running in a container (e.g. snap, flatpak):_ - - When Firefox is packaged inside a container (like the default Firefox browser - shipped with Ubuntu 22.04), it may see a different filesystem to the host. - This can affect access to the generated profile directory, which may result - in a hang when starting Firefox. Workarounds are listed in the geckodriver - [usage documentation]. - -- _Potential hang with `moz:debuggerAddress` capability set to `true`:_ - - After enabling the site-isolation feature in Firefox with geckodriver 0.32.1 - some WebDriver clients like Selenium that use the Chrome DevTools Protocol (CDP) - by default for logging events could trigger a hang in Firefox's experimental CDP - implementation. The fix for this problem will be shipped with Firefox 112. - Until then the following Firefox preferences should be set: - - - `fission.bfcacheInParent: false` - - `fission.webContentIsolationStrategy: 0` - -### Fixed - -- With the release of geckodriver 0.32.1 the marionette crate was inappropriately - bumped to a semver incompatible version and caused `cargo install geckodriver` - to fail for older releases. - -## 0.32.1 (2023-02-02, `b7f075124503`) - -### Known problems - -- _Startup hang with Firefox running in a container (e.g. snap, flatpak):_ - - When Firefox is packaged inside a container (like the default Firefox browser - shipped with Ubuntu 22.04), it may see a different filesystem to the host. - This can affect access to the generated profile directory, which may result - in a hang when starting Firefox. Workarounds are listed in the geckodriver - [usage documentation]. - -- _Potential hang with `moz:debuggerAddress` capability set to `true`:_ - - After enabling the site-isolation feature in Firefox with geckodriver 0.32.1 - some WebDriver clients like Selenium that use the Chrome DevTools Protocol (CDP) - by default for logging events could trigger a hang in Firefox's experimental CDP - implementation. The fix for this problem will be shipped with Firefox 112. - Until then the following Firefox preferences should be set: - - - `fission.bfcacheInParent: false` - - `fission.webContentIsolationStrategy: 0` - -### Fixed - -- When using the boolean capability `moz:debuggerAddress` with a value of `true` - the site-isolation feature in Firefox will no longer accidentally be turned off. - This behavior affected all users of WebDriver clients especially Selenium, which - set this capability by default, and caused Firefox on desktop systems to be - launched in an unsupported mode. - -## 0.32.0 (2022-10-13, `4563dd583110`) - -### Added - -- Native aarch64 builds of geckodriver for Linux and Windows are now available. - -- Support `wheel` input source for [Actions], which is associated with a - wheel-type input device. This endpoint is supported by geckodriver when - using Firefox version ≥106. - -- Support `touch` as `pointerType` for `pointer` input source for [Actions], - which is associated with a touch input device. This also includes the - addition of all the remaining properties for `pointer` input sources as - specified by WebDriver. This endpoint is supported by geckodriver when using - Firefox version ≥104. - -### Fixed - -- Using geckodriver to launch Firefox inside a sandbox -- for example - a Firefox distribution using Snap or Flatpak -- can fail with a - "Profile not found" error if the sandbox restricts Firefox's ability - to access the system temporary directory. geckodriver uses the - temporary directory to store Firefox profiles created during the run. - - This issue can now be worked around by using the `--profile-root` - command line option or setting the `TMPDIR` environment variable to - a location that both Firefox and geckodriver have read/write access - to e.g.: - - ```bash - % mkdir $HOME/tmp - % geckodriver --profile-root=~/tmp - ``` - - or - - ```bash - % TMPDIR=$HOME/tmp geckodriver - ``` - - Alternatively, geckodriver may be used with a Firefox install that - is not packaged inside a sandbox e.g. from [mozilla.org]. - -- The sandboxed Firefox binary is now automatically detected when geckodriver - is used from within a Snap confinement. - - Implemented by [Olivier Tilloy]. - -- On MacOS the geckodriver binary is now technically both signed and notarized. - - Note: The actual validation can only be performed if the machine that starts - the geckodriver binary for the very first time is online. You can find more - details on how to work around this issue in the [macOS notarization] section - of the documentation. - -- The backup of the original Firefox preferences are now correctly restored - on Android when the WebDriver session ends. - -### Changed - -- Update dependencies - -## 0.31.0 (2022-04-11, `b617178ef491`) - -### Known problems - -- _Firefox running in Linux Sandbox (e.g. Snap package):_ - - Using geckodriver to launch Firefox inside a sandbox -- for example - a Firefox distribution using Snap or Flatpak -- can fail with a - "Profile not found" error if the sandbox restricts Firefox's ability - to access the system temporary directory. geckodriver uses the - temporary directory to store Firefox profiles created during the run. - - As workaround geckodriver may be used with a Firefox install that - is not packaged inside a sandbox e.g. from [mozilla.org]. - -- _macOS 10.15 (Catalina) and later:_ - - Due to the requirement from Apple that all programs must be - notarized, geckodriver will not work on Catalina if you manually - download it through another notarized program, such as Firefox. - - Whilst we are working on a repackaging fix for this problem, you can - find more details on how to work around this issue in the [macOS - notarization] section of the documentation. - -### Added - -- Users with the [Rust] toolchain installed can now build and install - geckodriver from [crates.io] using Cargo: - - % cargo install geckodriver - -- Support for [Get Element Shadow Root] - - Implemented by [David Burns]. - - The standardised WebDriver [Get Element Shadow Root] endpoint provides a way - to retrieve the Shadow Root of a given web element. This endpoint is - supported by geckodriver when using Firefox version ≥96. - -- Support for additional hosts and origins - - Users can now specify a list of allowed `Host` and `Origin` headers for - incoming requests using the [`--allow-hosts`] and [`--allow-origins`] command - line options, respectively. When such a flag is provided, exactly the given - values will be permitted. - - By default any request with an `Origin` header is rejected, and only requests - containing the bound hostname (specified via `--host`), or an IP address, - in the Host header are allowed. These configuration options are - designed to support scenarios where geckodriver is running on a different - network node to the host e.g. some container based setups. - -### Fixed - -- Geckodriver lets Marionette itself select a system allocated port, so that - it's no longer required to specify a fixed port when using a custom Firefox - profile. This is done by reading the `MarionetteActivePort` file of the - Firefox profile in-use. This helps to avoid port collisions when multiple - Firefox instances are run in parallel. - -- It's no longer possible to specify both the `androidPackage` and `binary` - capabilities togther within [`moz:firefoxOptions`] because these capabilites - are mutually exclusive. - -## 0.30.0 (2021-09-16, `d372710b98a6`) - -### Security Fixes - -- CVE-2021-4138 - - Fixed a DNS rebinding issues by enforcing a stricter `Host` header check. - - Reported by Gabriel Corona. - - - Improved `Host` header checks to reject requests not sent to a well-known - local hostname or IP, or the server-specified hostname. - -### Known problems - -- geckodriver restricts connections to local IP addresses. This can interfere - with deployments in which geckodriver is running on a different network node - to the tests e.g. some container or virtual-machine based setups. - -- _macOS 10.15 (Catalina) and later:_ - - Due to the requirement from Apple that all programs must be - notarized, geckodriver will not work on Catalina if you manually - download it through another notarized program, such as Firefox. - - Whilst we are working on a repackaging fix for this problem, you can - find more details on how to work around this issue in the [macOS - notarization] section of the documentation. - -- _Android:_ - - For releases of Firefox 89.0 and earlier Marionette will only be enabled in - GeckoView based applications when the Firefox preference - `devtools.debugger.remote-enabled` is set to `true` via [`moz:firefoxOptions`]. - -### Added - -- Support for WebDriver clients to opt in to WebDriver BiDi. - - Introduced the new boolean capability [`webSocketUrl`] that can be used by - WebDriver clients to opt in to a bidirectional connection. A string capability - with the same name will be returned by [`NewSession`], which contains the - WebSocket URL of the newly created WebDriver session in the form of: - `ws://host:port/session/`. - - When running on Android a port forward will be set on the host machine, - which is using the exact same port as on the device. - - All the supported WebDriver BiDi commands depend on the version of - Firefox, and not geckodriver. The first commands will be shipped in - Firefox 94. - -- It's now possible to set additional preferences when a custom profile has been - specified. At the end of the session they will be removed. - -### Fixed - -- Added validation that the `--host` argument resolves to a local IP address. - -- Limit the `--foreground` argument of Firefox to MacOS only. - -- Increased Marionette handshake timeout to not fail for slow connections. - -- `Marionette:Quit` is no longer sent twice during session deletion. - -- When deleting a session that was attached to an already running browser - instance, the browser is not getting closed anymore. - -- Android - - - Starting Firefox on Android from a Windows based host will now succeed as - we are using the correct Unix path separator to construct on-device paths. - - - Arguments as specified in [`moz:firefoxOptions`] are now used when starting - Firefox. - - - Port forwards set for Marionette and the WebSocket server (WebDriver BiDi) - are now correctly removed when geckodriver exits. - - - The test root folder is now removed when geckodriver exists. - -## 0.29.1 (2021-04-09, `970ef713fe58`) - -### Known problems - -- _macOS 10.15 (Catalina) and later:_ - - Due to the requirement from Apple that all programs must be - notarized, geckodriver will not work on Catalina if you manually - download it through another notarized program, such as Firefox. - - Whilst we are working on a repackaging fix for this problem, you can - find more details on how to work around this issue in the [macOS - notarization] section of the documentation. - -- _Android:_ - - Marionette will only be enabled in GeckoView based applications when the - Firefox preference `devtools.debugger.remote-enabled` is set to `true` via - [`moz:firefoxOptions`]. This will be fixed in the Firefox 90 release for - Android. - -### Added - -- When testing GeckoView based applications on Android it's now enough to - specify the `androidPackage` capability. The appropriate activity name, - and required intent arguments will now automatically be used for - applications released by Mozilla. - -- Native AArch64 (M1) builds of geckodriver for MacOS are now available. These - are currently shipped as Tier2 due to missing test infrastructure. Please let - us know if you experience issues. - -### Fixed - -- Fixed a stack overflow crash in thread 'webdriver dispatcher' when - handling certain device errors. - -- Fixed an application crash due to missing permissions on unrooted devices - by changing the location of the test related files, e.g the profile folder. - Therefore the deprecated --android-storage command line argument - now defaults to the `sdcard` option, which changed its location to - `$EXTERNAL_STORAGE/Android/data/%androidPackage%/files/`. With this change - proper support for unrooted devices running Android 10+ has been added. - - _Note_: Do not use the --android-storage command line argument - anymore unless there is a strong reason. It will be removed in a future - release. - -## 0.29.0 (2021-01-14, `cf6956a5ec8e`) - -### Known problems - -- _macOS 10.15 (Catalina) and later:_ - - Due to the requirement from Apple that all programs must be - notarized, geckodriver will not work on Catalina if you manually - download it through another notarized program, such as Firefox. - - Whilst we are working on a repackaging fix for this problem, you can - find more details on how to work around this issue in the [macOS - notarization] section of the documentation. - -- _Android:_ - - Marionette will only be enabled in GeckoView based applications when the - Firefox preference `devtools.debugger.remote-enabled` is set to `true` via - [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox - for Android releases. - - In some cases geckodriver could crash due to a stack overflow when handling - certain device errors. - - On unrooted Android 10+ devices startup crashes of the application can be - experienced due to an inappropriate location of test related files, e.g the - profile folder. - -### Added - -- Introduced the new boolean capability [`moz:debuggerAddress`] that can be used - to opt-in to the experimental Chrome DevTools Protocol (CDP) implementation. - A string capability with the same name will be returned by [`NewSession`], - which contains the `host:port` combination of the HTTP server that can be - used to query for websockets of available targets. - - Note: For this experimental feature the site-isolation support of - Firefox aka [Fission] will be not available. - -## 0.28.0 (2020-11-03, `c00d2b6acd3f`) - -### Known problems - -- _macOS 10.15 (Catalina) and later:_ - - Due to the requirement from Apple that all programs must be - notarized, geckodriver will not work on Catalina if you manually - download it through another notarized program, such as Firefox. - - Whilst we are working on a repackaging fix for this problem, you can - find more details on how to work around this issue in the [macOS - notarization] section of the documentation. - -- _Android:_ - - Marionette will only be enabled in GeckoView based applications when the - Firefox preference `devtools.debugger.remote-enabled` is set to `true` via - [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox - for Android releases. - - In some cases geckodriver could crash due to a stack overflow when handling - certain device errors. - - On unrooted Android 10+ devices startup crashes of the application can be - experienced due to an inappropriate location of test related files, e.g the - profile folder. - -### Added - -- The command line flag `--android-storage` has been added, to allow geckodriver - to also control Firefox on root-less Android devices. - See the [documentation][Flags] for available values. - -### Fixed - -- Firefox can be started again via a shell script that is located outside of the - Firefox directory on Linux. - -- If Firefox cannot be started by geckodriver the real underlying error message is - now being reported. - -- Version numbers for minor and extended support releases of Firefox are now parsed correctly. - -### Removed - -- Since Firefox 72 extension commands for finding an element’s anonymous children - and querying its attributes are no longer needed, and have been removed. - -## 0.27.0 (2020-07-27, `7b8c4f32cdde`) - -### Security Fixes - -- CVE-2020-15660 - - Improved validation of incoming requests to prevent remote - requests being treated as local. - - Reported by Gabriel Corona. - - - Added additional checks on the `Content-Type` header for `POST` - requests to disallow `application/x-www-form-urlencoded`, - `multipart/form-data` and `text/plain`. - - - Added checking of the `Origin` header for `POST` requests. - - - The version number of Firefox is now checked when establishing a session. - -### Known problems - -- _macOS 10.15 (Catalina) and later:_ - - Due to the requirement from Apple that all programs must be - notarized, geckodriver will not work on Catalina if you manually - download it through another notarized program, such as Firefox. - - Whilst we are working on a repackaging fix for this problem, you can - find more details on how to work around this issue in the [macOS - notarization] section of the documentation. - -- _Android:_ - - Marionette will only be enabled in GeckoView based applications when the - Firefox preference `devtools.debugger.remote-enabled` is set to `true` via - [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox - for Android releases. - - In some cases geckodriver could crash due to a stack overflow when handling - certain device errors. - -### Added - -- To set environment variables for the launched Firefox for Android, - it is now possible to add an `env` object on [`moz:firefoxOptions`] - (note: this is not supported for Firefox Desktop) - -- Support for print-to-PDF - - The newly standardised WebDriver [Print] endpoint provides a way to - render pages to a paginated PDF representation. This endpoint is - supported by geckodriver when using Firefox version ≥78. - -- Support for same-site cookies - - Cookies can now be set with a `same-site` parameter, and the value - of that parameter will be returned when cookies are - retrieved. Requires Firefox version ≥79. Thanks to [Peter Major] for - the patch. - -### Fixed - -- _Android:_ - - - Firefox running on Android devices can now be controlled from a Windows host. - - - Setups with multiple connected Android devices are now supported. - - - Improved cleanup of configuration files. This prevents crashes if - the application is started manually after launching it through - geckodriver. - -- Windows and Linux binaries are again statically linked. - -## 0.26.0 (2019-10-12, `e9783a644016'`) - -Note that with this release the minimum recommended Firefox version -has changed to Firefox ≥60. - -### Known problems - -- _macOS 10.15 (Catalina) and later:_ - - Due to the recent requirement from Apple that all programs must - be notarized, geckodriver will not work on Catalina if you manually - download it through another notarized program, such as Firefox. - - Whilst we are working on a repackaging fix for this problem, you - can find more details on how to work around this issue in the - [macOS notarization] section of the documentation. - -- _Windows:_ - - You must still have the [Microsoft Visual Studio redistributable - runtime] installed on your system for the binary to run. This - is a known bug which we weren't able fix for this release. - -- _Android:_ - - Marionette will only be enabled in GeckoView based applications when the - Firefox preference `devtools.debugger.remote-enabled` is set to `true` via - [`moz:firefoxOptions`]. This will be fixed in one of the upcoming Firefox - for Android releases. - - In some cases geckodriver could crash due to a stack overflow when handling - certain device errors. - -### Added - -- Support for Firefox on Android - - Starting with this release geckodriver is able to connect to - Firefox on Android systems, and to control packages based on - [GeckoView]. - - Support for Android works by the geckodriver process running on - a host system and Firefox running within either an emulator or - on a physical device connected to the host system. This requires - you to first [enable remote debugging on the Android device]. - - The WebDriver client must set the [`platformName` capability] to - "`android`" and the `androidPackage` capability within - [`moz:firefoxOptions`] to the Android package name of the Firefox - application. - - The full list of new capabilities specific to Android, instructions - how to use them, and examples can be found in the [`moz:firefoxOptions`] - documentation on MDN. - - When the session is created, the `platformName` capability will - return "`android`" instead of reporting the platform of the host - system. - -### Changed - -- Continued Marionette refactoring changes - - 0.25.0 came with a series of internal changes for how geckodriver - communicates with Firefox over the Marionette protocol. This - release contains the second half of the refactoring work. - -### Fixed - -- Connection attempts to Firefox made more reliable - - geckodriver now waits for the Marionette handshake before assuming - the session has been established. This should improve reliability - in creating new WebDriver sessions. - -- Corrected error codes used during session creation - - When a new session was being configured with invalid input data, - the error codes returned was not always consistent. Attempting - to start a session with a malformed capabilities configuration - will now return the [`invalid argument`] error consistently. - -## 0.25.0 (2019-09-09, `bdb64cf16b68`) - -__Note to Windows users!__ -With this release you must have the [Microsoft Visual Studio redistributable runtime] -installed on your system for the binary to run. -This is a [known bug](https://github.com/mozilla/geckodriver/issues/1617) -with this particular release that we intend to release a fix for soon. - -### Added - -- Added support for HTTP `HEAD` requests to the HTTPD - - geckodriver now responds correctly to HTTP `HEAD` requests, - which can be used for probing whether it supports a particular API. - - Thanks to [Bastien Orivel] for this patch. - -- Added support for searching for Nightly’s default path on macOS - - If the location of the Firefox binary is not given, geckodriver - will from now also look for the location of Firefox Nightly in - the default locations. The ordered list of search paths on macOS - is as follows: - - 1. `/Applications/Firefox.app/Contents/MacOS/firefox-bin` - 2. `$HOME/Applications/Firefox.app/Contents/MacOS/firefox-bin` - 3. `/Applications/Firefox Nightly.app/Contents/MacOS/firefox-bin` - 4. `$HOME/Applications/Firefox Nightly.app/Contents/MacOS/firefox-bin` - - Thanks to [Kriti Singh] for this patch. - -- Support for application bundle paths on macOS - - It is now possible to pass an application bundle path, such as - `/Applications/Firefox.app` as argument to the `binary` field in - [`moz:firefoxOptions`]. This will be automatically resolved to - the absolute path of the binary when Firefox is started. - - Thanks to [Nupur Baghel] for this patch. - -- macOS and Windows builds are signed - - With this release of geckodriver, executables for macOS and Windows - are signed using the same certificate key as Firefox. This should - help in cases where geckodriver previously got misidentified as - a virus by antivirus software. - -### Removed - -- Dropped support for legacy Selenium web element references - - The legacy way of serialising web elements, using `{"ELEMENT": }`, - has been removed in this release. This may break older Selenium - clients and clients which are otherwise not compatible with the - WebDriver standard. - - Thanks to [Shivam Singhal] for this patch. - -- Removed `--webdriver-port` command-line option - - `--webdriver-port ` was an undocumented alias for `--port`, - initially used for backwards compatibility with clients - prior to Selenium 3.0.0. - -### Changed - -- Refactored Marionette serialisation - - Much of geckodriver’s internal plumbing for serialising WebDriver - requests to Marionette messages has been refactored to decrease - the amount of manual lifting. - - This work should have no visible side-effects for users. - - Thanks to [Nupur Baghel] for working on this throughout her - Outreachy internship at Mozilla. - -- Improved error messages for incorrect command-line usage - -### Fixed - -- Errors related to incorrect command-line usage no longer hidden - - By mistake, earlier versions of geckodriver failed to print incorrect - flag use. With this release problems are again written to stderr. - -- Search system path for Firefox binary on BSDs - - geckodriver would previously only search the system path for the - `firefox` binary on Linux. Now it supports different BSD flavours - as well. - -## 0.24.0 (2019-01-28, `917474f3473e`) - -### Added - -- Introduces `strictFileInteractability` capability - - The new capability indicates if strict interactability checks - should be applied to `` elements. As strict - interactability checks are off by default, there is a change - in behaviour when using [Element Send Keys] with hidden file - upload controls. - -- Added new endpoint `GET /session/{session id}/moz/screenshot/full` - for taking full document screenshots, thanks to Greg Fraley. - -- Added new `--marionette-host ` flag for binding to a - particular interface/IP layer on the system. - -- Added new endpoint `POST /session/{session_id}/window/new` - for the [New Window] command to create a new top-level browsing - context, which can be either a window or a tab. The first version - of Firefox supporting this command is Firefox 66.0. - -- When using the preference `devtools.console.stdout.content` set to - `true` logging of console API calls like `info()`, `warn()`, and - `error()` can be routed to stdout. - -- geckodriver now sets the `app.update.disabledForTesting` preference - to prevent Firefox >= 65 from automatically updating whilst under - automation. - -### Removed - -- ARMv7 HF builds have been discontinued - - We announced back in September 2018 that we would stop building for ARM, - but builds can be self-serviced by building from source. - - To cross-compile from another host system, you can use this command: - - % cargo build --target armv7-unknown-linux-gnueabihf - -### Changed - -- Allow file uploads to hidden `` elements - - Through a series of changes to the WebDriver specification, - geckodriver is now aligned with chromedriver’s behaviour that - allows interaction with hidden `` elements. - - This allows WebDriver to be used with various popular web - frameworks that—through indirection—hides the file upload control - and invokes it through other means. - -- Allow use of an indefinite script timeout for the [Set Timeouts] - command, thanks to reimu. - -### Fixed - -- Corrected `Content-Type` of response header to `utf-8` to fix - an HTTP/1.1 compatibility bug. - -- Relaxed the deserialization of timeouts parameters to allow unknown - fields for the [Set Timeouts] command. - -- Fixed a regression in the [Take Element Screenshot] to not screenshot - the viewport, but the requested element. - -## 0.23.0 (2018-10-03) - -This release contains a number of fixes for regressions introduced -in 0.22.0, where we shipped a significant refactoring to the way -geckodriver internally dealt with JSON serialisation. - -### Removed - -- The POST `/session/{session id}/element/{element id}/tap` endpoint - was removed, thanks to Kerem Kat. - -### Changed - -- [webdriver crate] upgraded to 0.38.0. - -### Fixed - -- `desiredCapabilities` and `requiredCapabilities` are again - recognised on session creation - - A regression in 0.22.0 caused geckodriver to recognise `desired` - and `required` instead of the correct `desiredCapabilities` - and `requiredCapabilities`. This will have caused significant - problems for users who relied on this legacy Selenium-style - session creation pattern. - - Do however note that support for Selenium-styled new session - requests is temporary and that this will be removed sometime - before the 1.0 release. - -- `duration` field made optional on pause actions - - A regression in 0.22.0 caused the pause action primitive to - require a `duration` field. This has now been fixed so that - pauses in action chains can be achieved with the default duration. - -- Log level formatted to expected Marionette input - - A regression in 0.22.0 caused the log level to be improperly - formatted when using Firefox pre-releases. This is now fixed so - that the requested log level is correctly interpreted by Marionette. - -- `temporary` field on addon installation made optional - - A regression in 0.22.0 caused the `temporary` field for POST - `/session/{session id}/moz/addon/install` to be mandatory. This has - now been fixed so that an addon is installed permanently by default. - -- SHA1s in version information uses limited number of characters - - The SHA1 used in `--version` when building geckodriver from a - git repository is now limited to 12 characters, as it is when - building from an hg checkout. This ensures reproducible builds. - -## 0.22.0 (2018-09-15) - -This release marks an important milestone on the path towards -a stable release of geckodriver. Large portions of geckodriver -and the [webdriver] library it is based on has been refactored to -accommodate using [serde] for JSON serialization. - -We have also made great strides to improving [WebDriver conformance], -to the extent that geckodriver is now _almost_ entirely conforming -to the standard. - -### Added - -- Support for WebDriver web element-, web frame-, and web window - identifiers from Firefox. - -- Added support for the non-configurable `setWindowRect` capability - from WebDriver. - - This capability informs whether the attached browser supports - manipulating the window dimensions and position. - -- A new extension capability `moz:geckodriverVersion` is returned - upon session creation. - -### Changed - -- All JSON serialization and deserialisation has moved from - rustc_serialize to [serde]. - -- The HTTP status codes used for [script timeout] and [timeout] - errors has changed from Request Timeout (408) to Internal Server - Error (500) in order to not break HTTP/1.1 `Keep-Alive` support, - as HTTP clients interpret the old status code to mean they should - duplicate the request. - -- The HTTP/1.1 `Keep-Alive` timeout for persistent connections has - been increased to 90 seconds. - -- An [invalid session ID] error is now returned when there is no - active session. - -- An [invalid argument] error is now returned when [Add Cookie] - is given invalid parameters. - -- The handshake when geckodriver connects to Marionette has been - hardened by killing the Firefox process if it fails. - -- The handshake read timeout has been reduced to 10 seconds instead - of waiting forever. - -- The HTTP server geckodriver uses, [hyper], has been upgraded to - version 0.12, thanks to [Bastien Orivel]. - -- geckodriver version number is no longer logged on startup, as - the log level is not configured until a session is created. - - The version number is available through `--version`, and now - also through a new `moz:geckodriverVersion` field in the matched - capabilities. - -- [webdriver crate] upgraded to 0.37.0. - -### Fixed - -- Parsing [timeout object] values has been made WebDriver conforming, - by allowing floats as input. - -- Implicit downloads of OpenH264 and Widevine plugins has been disabled. - -- The commit hash and date displayed when invoking `--version` - is now well-formatted when built from an hg repository, thanks to - [Jeremy Lempereur]. - -- Many documentation improvements, now published on - . - -## 0.21.0 (2018-06-15) - -Note that with this release of geckodriver the minimum recommended -Firefox and Selenium versions have changed: - -- Firefox 57 (and greater) -- Selenium 3.11 (and greater) - -### Added - -- Support for the chrome element identifier from Firefox. - -- The `unhandledPromptBehavior` capability now accepts `accept and - notify`, `dismiss and notify`, and `ignore` options. - - Note that the unhandled prompt handler is not fully supported in - Firefox at the time of writing. - -### Changed - -- Firefox will now be started with the `-foreground` and `-no-remote` - flags if they have not already been specified by the user in - [`moz:firefoxOptions`]. - - `-foreground` will ensure the application window gets focus when - Firefox is started, and `-no-remote` will prevent remote commands - to this instance of Firefox and also ensure we always start a new - instance. - -- WebDriver commands that do not have a return value now correctly - return `{value: null}` instead of an empty dictionary. - -- The HTTP server now accepts `Keep-Alive` connections. - -- Firefox remote protocol command mappings updated. - - All Marionette commands changed to make use of the `WebDriver:` - prefixes introduced with Firefox 56. - -- Overhaul of Firefox preferences. - - Already deprecated preferences in Firefox versions earlier than - 57 got removed. - -- [webdriver crate] upgraded to 0.36.0. - -### Fixed - -- Force use of IPv4 network stack. - - On certain system configurations, where `localhost` resolves to - an IPv6 address, geckodriver would attempt to connect to Firefox - on the wrong IP stack, causing the connection attempt to time out - after 60 seconds. We now ensure that geckodriver uses IPv4 - consistently to both connect to Firefox and for allocating a free - port. - -- geckodriver failed to locate the correct Firefox binary if it was - found under a _firefox_ or _firefox-bin_ directory, depending on - the system, because it thought the parent directory was the - executable. - -- On Unix systems (macOS, Linux), geckodriver falsely reported - non-executable files as valid binaries. - -- When stdout and stderr is redirected by geckodriver, a bug prevented - the redirections from taking effect. - -## 0.20.1 (2018-04-06) - -### Fixed - -- Avoid attempting to kill Firefox process that has stopped. - - With the change to allow Firefox enough time to shut down in - 0.20.0, geckodriver started unconditionally killing the process - to reap its exit status. This caused geckodriver to inaccurately - report a successful Firefox shutdown as a failure. - - The regression should not have caused any functional problems, but - the termination cause and the exit status are now reported correctly. - -## 0.20.0 (2018-03-08) - -### Added - -- New `--jsdebugger` flag to open the [Browser Toolbox] when Firefox - launches. This is useful for debugging Marionette internals. - -- Introduced the temporary, boolean capability - `moz:useNonSpecCompliantPointerOrigin` to disable the WebDriver - conforming behavior of calculating the Pointer Origin. - -### Changed - -- HTTP status code for the [`StaleElementReference`] error changed - from 400 (Bad Request) to 404 (Not Found). - -- Backtraces from geckodriver no longer substitute for missing - Marionette stacktraces. - -- [webdriver crate] upgraded to 0.35.0. - -### Fixed - -- The Firefox process is now given ample time to shut down, allowing - enough time for the Firefox shutdown hang monitor to kick in. - - Firefox has an integrated background monitor that observes - long-running threads during shutdown. These threads will be - killed after 63 seconds in the event of a hang. To allow Firefox - to shut down these threads on its own, geckodriver has to wait - that time and some additional seconds. - -- Grapheme clusters are now accepted as input for keyboard input - to actions. - - Input to the `value` field of the `keyDown` and `keyUp` action - primitives used to only accept single characters, which means - geckodriver would error when a valid grapheme cluster was sent in, - for example with the tamil nadu character U+0BA8 U+0BBF. - - Thanks to Greg Fraley for fixing this bug. - -- Improved error messages for malformed capability values. - -## 0.19.1 (2017-10-30) - -### Changed - -- Search suggestions in the location bar turned off as not to - trigger network connections - -- Block addons incompatible with E10s - -### Fixed - -- Marionette stacktraces are now correctly propagated - -- Some error messages have been clarified - -### Removed - -- Removed obsolete `socksUsername` and `socksPassword` proxy - configuration keys because neither were picked up or recognised - -## 0.19.0 (2017-09-16) - -Note that with geckodriver 0.19.0 the following versions are recommended: - -- Firefox 55.0 (and greater) -- Selenium 3.5 (and greater) - -### Added - -- Added endpoint: - - POST `/session/{session id}/window/minimize` for the [Minimize Window] - command - -- Added preference `extensions.shield-recipe-client.api_url` to disable - shield studies which could unexpectedly change the behavior of Firefox - -- Introduced the temporary, boolean capability `moz:webdriverClick` to - enable the WebDriver conforming behavior of the [Element Click] command - -- Added crashreporter environment variables to better control the browser - in case of crashes - -- Added preference `dom.file.createInChild` set to true to allow file - object creation in content processes - -### Changed - -- Log all used application arguments and not only `-marionette` - -- Early abort connection attempts to Marionette if the Firefox process - closed unexpectetly - -- Removed deprecated `socksProxyVersion` in favor of `socksVersion` - -- Removed `ftpProxyPort`, `httpProxyPort`, `sslProxyPort`, and - `socksProxyPort` because _ports_ have to be set for `ftpProxy`, - `httpProxy`, `sslProxy`, and `socksProxy` using ":" - -- The `proxyType` `noproxy` has been replaced with `direct` in accordance - with recent WebDriver specification changes - -- The [`WindowRectParameters`] have been updated to return signed 32-bit - integers in accordance with the CSS and WebDriver specifications, and - to be more liberal with the input types - -- Mapped the [`FullscreenWindow`] to the correct Marionette command - -- To make sure no browser process is left behind when the [`NewSession`] - fails, the process is closed immediately now - -- `/moz/addon/install` command accepts an `addon` parameter, in lieu of - `path`, containing an addon as a Base64 string (fixed by [Jason Juang]) - -- [webdriver crate] upgraded to version 0.31.0 - -- [mozrunner crate] upgraded to version 0.5.0 - -### Removed - -- Removed the following obsolete preferences for Firefox: - - `browser.safebrowsing.enabled` - - `browser.safebrowsing.forbiddenURIs.enabled` - - `marionette.defaultPrefs.port` - - `marionette.logging` - -## 0.18.0 (2017-07-10) - -### Changed - -- [`RectResponse`] permits returning floats for `width` and `height` - fields - -- New type [`CookieResponse`] for the [`GetNamedCookie`] command returns - a single cookie, as opposed to an array of a single cookie - -- To pick up a prepared profile from the filesystem, it is now possible - to pass `["-profile", "/path/to/profile"]` in the `args` array on - [`moz:firefoxOptions`] - -- geckodriver now recommends Firefox 53 and greater - -- Version information (`--version`) contains the hash from from the - commit used to build geckodriver - -- geckodriver version logged on startup - -- [webdriver crate] upgraded to version 0.27.0 - -- [mozrunner crate] upgraded to version 0.4.1 - -### Fixed - -- The [`SetTimeouts`] command maps to the Marionette `setTimeouts` - command, which makes geckodriver compatible with Firefox 56 and greater - -- Linux x86 (i686-unknown-linux-musl) builds are fixed - -## 0.17.0 (2017-06-09) - -### Added - -- Added endpoints: - - POST `/session/{session id}/window/fullscreen` to invoke the window - manager-specific `full screen` operation - - POST `/session/{session id}/moz/addon/install` to install an extension - (Gecko only) - - POST `/session/{session id}/moz/addon/uninstall` to uninstall an - extension (Gecko only) - -### Changed - -- Increasing the length of the `network.http.phishy-userpass-length` - preference will cause Firefox to not prompt when navigating to a - website with a username or password in the URL - -- Library dependencies upgraded to mozrunner 0.4 and mozprofile 0.3 - to allow overriding of preferences via capabilities if those have been - already set in the profile - -- Library dependencies upgraded to mozversion 0.1.2 to only use the - normalized path of the Firefox binary for version checks but not to - actually start the browser, which broke several components in Firefox - on Windows - -### Fixed - -- The [SetWindowRect] command now returns the [WindowRectResponse] - when it is done - -- Use ASCII versions of array symbols to properly display them in the - Windows command prompt - -- Use [`SessionNotCreated`] error instead of [`UnknownError`] if there - is no current session - -## 0.16.1 (2017-04-26) - -### Fixed - -- Read Firefox version number from stdout when failing - to look for the application .ini file (fixes [Selenium - #3884](https://github.com/SeleniumHQ/selenium/issues/3884)) - -- Session is now ended when closing the last Firefox window (fixes - [#613](https://github.com/mozilla/geckodriver/issues/613)) - -## 0.16.0 (2017-04-21) - -Note that geckodriver v0.16.0 is only compatible with Selenium 3.4 -and greater. - -### Added - -- Support for WebDriver-conforming [New Session] negotiation, with - `desiredCapabilities`/`requiredCapabilities` negotiation as fallback - -- Added two new endpoints: - - GET `/session/{session id}/window/rect` for [Get Window Rect] - - POST `/session/{session id}/window/rect` for [Set Window Rect] - -- Align errors with the [WebDriver errors]: - - Introduces new errors [`ElementClickIntercepted`], - [`ElementNotInteractable`], [`InvalidCoordinates`], [`NoSuchCookie`], - [`UnableToCaptureScreen`], and [`UnknownCommand`] - - Removes `ElementNotVisible` and `InvalidElementCoordinates` errors - -### Removed - -- Removed following list of unused endpoints: - - GET `/session/{session id}/alert_text` - - POST `/session/{session id}/alert_text` - - POST `/session/{session id}/accept_alert` - - POST `/session/{session id}/dismiss_alert` - - GET `/session/{session id}/window_handle` - - DELETE `/session/{session id}/window_handle` - - POST `/session/{session id}/execute_async` - - POST `/session/{session id}/execute` - -### Changed - -- [`SendKeysParameters`], which is used for the [Element Send Keys] and - [Send Alert Text] commands, has been updated to take a string `text` - field - -- [`CookieResponse`] and [`CloseWindowResponse`] fixed to be properly - wrapped in a `value` field, like other responses - -- Allow negative numbers for `x` and `y` fields in `pointerMove` action - -- Disable Flash and the plugin container in Firefox by - default, which should help mitigate the “Plugin Container - for Firefox has stopped working” problems [many users were - reporting](https://github.com/mozilla/geckodriver/issues/225) when - deleting a session - -- Preferences passed in a profile now take precedence over - set of default preferences defined by geckodriver (fixed by - [Marc Fisher](https://github.com/DrMarcII)) - - The exceptions are the `marionette.port` and `marionette.log.level` - preferences and their fallbacks, which are set unconditionally and - cannot be overridden - -- Remove default preference that disables unsafe CPOW checks - -- WebDriver library updated to 0.25.2 - -### Fixed - -- Fix for the “corrupt deflate stream” exception that - sometimes occurred when trying to write an empty profile by - [@kirhgoph](https://github.com/kirhgoph) - -- Recognise `sslProxy` and `sslProxyPort` entries in the proxy - configuration object (fixed by [Jason Juang]) - -- Fix “`httpProxyPort` was not an integer” error (fixed by [Jason - Juang]) - -- Fix broken unmarshaling of _Get Timeouts_ response format from Firefox - 52 and earlier (fixed by [Jason Juang]) - -- Allow preferences in [`moz:firefoxOptions`] to be both positive- and - negative integers (fixed by [Jason Juang]) - -- Allow IPv6 hostnames in the proxy configuration object - -- i686-unknown-linux-musl (Linux 32-bit) build fixed - -- Log messages from other Rust modules are now ignored - -- Improved log messages to the HTTPD - -## 0.15.0 (2017-03-08) - -### Added - -- Added routing and parsing for the [Get Timeouts] command - -### Changed - -- All HTTP responses are now wrapped in `{value: …}` objects per the - WebDriver specification; this may likely require you to update your - client library - -- Pointer move action’s `element` key changed to `origin`, which - lets pointer actions originate within the context of the viewport, - the pointer’s current position, or from an element - -- Now uses about:blank as the new tab document; this was previously - disabled due to [bug 1333736](https://bugzil.la/1333736) in Marionette - -- WebDriver library updated to 0.23.0 - -### Fixed - -- Aligned the data structure accepted by the [Set Timeouts] command with - the WebDriver specification - -## 0.14.0 (2017-01-31) - -### Changed - -- Firefox process is now terminated and session ended when the last - window is closed - -- WebDriver library updated to version 0.20.0 - -### Fixed - -- Stacktraces are now included when the error originates from within - the Rust stack - -- HTTPD now returns correct response headers for `Content-Type` and - `Cache-Control` thanks to [Mike Pennisi] - -## 0.13.0 (2017-01-06) - -### Changed - -- When navigating to a document with an insecure- or otherwise invalid - TLS certificate, an [insecure certificate] error will be returned - -- On macOS, deducing Firefox’ location on the system will look for - _firefox-bin_ on the system path (`PATH` environmental variable) before - looking in the applications folder - -- Window position coordinates are allowed to be negative numbers, to - cater for maximised window positioning on Windows - -- WebDriver library updated to version 0.18.0 - -### Fixed - -- Check for single-character key codes in action sequences now counts - characters instead of bytes - -## 0.12.0 (2017-01-03) - -### Added - -- Added [Take Element Screenshot] command - -- Added new [Status] command - -- Added routing for the [Get Timeouts] command, but it is not yet - implemented in Marionette, and will return an _unsupported operation_ - error until it is - -- Implemented routing for [new actions API](Actions), but it too is not - yet fully implemented in Marionette - -### Changed - -- [Synced Firefox - preferences](https://github.com/mozilla/geckodriver/commit/2bfdc3ec8151c427a6a75a6ba3ad203459540495) - with those used in Mozilla automation - -- Default log level for debug builds of Firefox, which used to be `DEBUG`, - changed to `INFO`-level - -- WebDriver library dependency upgraded to 0.17.1 - -- Using _session not created_ error when failing to start session - -- geckodriver will exit with exit code 69 to indicate that the port - is unavailable - -### Fixed - -- Improved logging when starting Firefox - -- Reverted to synchronous logging, which should address cases of - inconsistent output when failing to bind to port - -- Clarified in README that geckodriver is not supported on Windows XP - -- Added documentation of supported capabilities to [README] - -- Included capabilities example in the [README] - -## 0.11.1 (2016-10-10) - -### Fixed - -- Version number in binary now reflects the release version - -## 0.11.0 (2016-10-10) - -### Added - -- Introduced continuous integration builds for Linux- and Windows 32-bit - binaries - -- Added commands for setting- and getting the window position - -- Added new extension commands for finding an element’s anonymous - children and querying its attributes; accessible through the - `/session/{sessionId}/moz/xbl/{elementId}/anonymous_children` - to return all anonymous children and - `/session/{sessionId}/moz/xbl/{elementId}/anonymous_by_attribute` to - return an anonymous element by a name and attribute query - -- Introduced a [`moz:firefoxOptions`] capability to customise a Firefox - session: - - - The `binary`, `args`, and `profile` entries on this dictionary - is equivalent to the old `firefox_binary`, `firefox_args`, and - `firefox_profile` capabilities, which have now all been removed - - - The `log` capability takes a dictionary such as `{log: "trace"}` - to enable trace level verbosity in Gecko - - - The `prefs` capability lets you define Firefox preferences through - capabilities - -- Re-introduced the `--webdriver-port` argument as a hidden alias to - `--port` - -### Changed - -- `firefox_binary`, `firefox_args`, and `firefox_profile` capabilities - removed in favour of the [`moz:firefoxOptions`] dictionary detailed above - and in the [README] - -- Removed `--no-e10s` flag, and geckodriver will from now rely on the - Firefox default multiprocessing settings (override using preferences) - -- Disable pop-up blocker in the default profile by @juangj - -- Changed Rust compiler version to 1.12 (beta) - temporarily because of [trouble linking Musl - binaries](https://github.com/rust-lang/rust/issues/34978) - -- Replaced _env_logger_ logging facility with the _slog_ package, - causing the `RUST_LOG` environment variable to no longer have any affect - -- Updated the WebDriver Rust library to version 0.15 - -### Fixed - -- Corrected link to repository in Cargo metadata - -- Verbosity shorthand flag `-v[v]` now works again, following the - replacement of the argument parsing library in the previous release - -- When the HTTPD fails to start, errors are propagated to the user - -- Disabled the additional welcome URL - (`startup.homepage_welcome_url.additional`) so that officially branded - Firefox builds do not start with two open tabs in fresh profiles - -- Disabled homepage override URL redirection on milestone upgrades, - which means a tab with an upgrade notice is not displayed when launching - a new Firefox version - -## 0.10.0 (2016-08-02) - -### Changed - -- Use multi-process Firefox (e10s) by default, added flag `--no-e10s` - to disable it and removed `--e10s` flag - -- Disable autofilling of forms by default by [Sven Jost] - -- Replace _argparse_ with _clap_ for arguments parsing - -### Fixed - -- Attempt to deploy a single file from Travis when making a release - -- Grammar fix in [README] - -## 0.9.0 (2016-06-30) - -### Added - -- Add ability to use `firefox_binary` capability to define location of - Firefox to use - -- Automatically detect the default Firefox path if one is not given - -- Cross-compile to Windows and ARMv7 (HF) in CI - -- Add Musl C library-backed static binaries in CI - -- Add `-v`, `-vv`, and `--log LEVEL` flags to increase Gecko verbosity - -- Add Get Element Property endpoint - -- Add new `--version` flag showing copying information and a link to - the repository - -### Changed - -- Now connects to a Marionette on a random port by default - -- Update webdriver-rust library dependency - -- Migrated to use Travis to deploy new releases - -- Reduced amount of logging - -- Introduced a changelog (this) - -## 0.8.0 (2016-06-07) - -### Added - -- Allow specifying array of arguments to the Firefox binary through the - `firefox_args` capability - -- Pass parameters with [New Session] command - -### Changed - -- Change product name to _geckodriver_ - -- Make README more exhaustive - -- Quit Firefox when deleting a session - -- Update webdriver-rust library - -- Update dependencies - -### Fixed - -- Fix tests - -- FIx typo in error message for parsing errors - -## 0.7.1 (2016-04-27) - -### Added - -- Add command line flag for using e10s enabled Firefox by [Kalpesh - Krishna] - -- Allow providing custom profiles - -### Changed - -- Allow binding to an IPv6 address by [Jason Juang] - -- By default, connect to host-agnostic localhost by [Jason Juang] - -- Make `GeckoContextParameters` public - -- Update dependencies - -### Fixed - -- Squash rustc 1.6 warnings by using `std::thread::sleep(dur: Duration)` - -## 0.6.2 (2016-01-20) - -### Added - -- Add LICENSE file from [Joshua Burning] - -- Schedule builds in CI on pushes and pull requests - -### Changed - -- Enable CPOWs in Marionette - -## 0.6.0 (2016-01-12) - -### Added - -- Add Get Page Source endpoint - -### Changed - -- Handle arrays being sent from Marionette - -- Correct build steps in [README] - -- Update what properties are read from errors sent by Marionette - -- Update dependencies - -## 0.5.0 (2015-12-10) - -### Changed - -- Update argparse dependency to use Cargo - -- Update to the latest version of the Marionette wire protocol - -- Update to latest webdriver-rust library - -- Update dependencies - -## 0.4.2 (2015-10-02) - -### Changed - -- Skip compiling optional items in hyper - -## 0.4.1 (2015-10-02) - -### Changed - -- Update webdriver-rust library - -- Update dependencies - -## 0.4.0 (2015-09-28) - -### Added - -- Add command extensions for switching between content- and chrome - contexts - -- Add more documentation from [Vlad Filippov] - -### Changed - -- Update Cargo.lock with new dependencies for building - -- Update for protocol updates that flatten commands - -- Update to new protocol error handling - -- Update for Marionette protocol version 3 changes - -- Strip any leading and trailing `{}` from the `sessionId` Marionette - returns - -- Update dependencies - -### Fixed - -- Fix `GetCSSValue` message to send correct key `propertyName` - -- Fix example in documentation from @vladikoff - -## 0.3.0 (2015-08-17) - -### Added - -- Add support for finding elements in subtrees - -## 0.2.0 (2015-05-20) - -### Added - -- Extra debug messages - -- Add ability to set WebDriver port - -- Add support for getting the active element - -- Add support for `GetCookies` and `DeleteCookie`/`DeleteCookies` - -- Add preferences that switch off certain features not required for - WebDriver tests - -### Changed - -- Make failing to communicate with Firefox a fatal error that closes - the session - -- Shut down session only when losing connection - -- Better handling of missing command line flags - -- Poll for connection every 100ms rather than every 100s - -- Switch to string-based error codes - -- Switch webdriver-rust library dependency to be pulled from git - -- Update dependencies - -### Fixed - -- Handle null id for switching to frame more correctly - -## 0.1.0 (2015-04-09) - -### Added - -- Add proxy for converting WebDriver HTTP protocol to Marionette protocol - -- Add endpoints for modal dialogue support - -- Allow connecting to a running Firefox instance - -- Add explicit Cargo.lock file - -- Start Firefox when we get a [NewSession] command - -- Add flag parsing and address parsing - -- Add basic error handling - -### Changed - -- Update for Rust beta - -- Switch to new IO libraries - -- Pin webdriver-rust commit so we can upgrade rustc versions independently - -- Set preferences when starting Firefox - -- Improve some error messages - -- Re-enable environment variable based logging - -### Fixed - -- Fix Get Element Rect command to return floats instead of integers - -- Fix passing of web elements to Switch To Frame command - -- Fix serialisation of script commands - -- Fix assorted bugs found by the Selenium test suite - -- Fix conversion of Find Element/Find Elements responses from Marionette - to WebDriver - -- Fixed build by updating Cargo.lock with new dependencies for building - -- Squash compile warnings - -[README]: https://github.com/mozilla/geckodriver/blob/master/README.md -[usage documentation]: -[Browser Toolbox]: https://developer.mozilla.org/en-US/docs/Tools/Browser_Toolbox -[WebDriver conformance]: https://wpt.fyi/results/webdriver/tests?label=experimental -[`webSocketUrl`]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/webSocketUrl -[`moz:firefoxOptions`]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions -[`moz:debuggerAddress`]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html#moz-debuggeraddress -[Microsoft Visual Studio redistributable runtime]: https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads -[GeckoView]: https://wiki.mozilla.org/Mobile/GeckoView -[Fission]: https://wiki.mozilla.org/Project_Fission -[Capabilities]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html -[Flags]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html -[`--allow-hosts`]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html#code-allow-hosts-var-allow-hosts-var-code -[`--allow-origins`]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html#code-allow-origins-var-allow-origins-var-code -[enable remote debugging on the Android device]: https://developers.google.com/web/tools/chrome-devtools/remote-debugging -[macOS notarization]: https://firefox-source-docs.mozilla.org/testing/geckodriver/Notarization.html -[Rust]: https://rustup.rs/ -[mozilla.org] https://www.mozilla.org/firefox/ - -[`CloseWindowResponse`]: https://docs.rs/webdriver/newest/webdriver/response/struct.CloseWindowResponse.html -[`CookieResponse`]: https://docs.rs/webdriver/newest/webdriver/response/struct.CookieResponse.html -[`DeleteSession`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.DeleteSession -[`ElementClickIntercepted`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.ElementClickIntercepted -[`ElementNotInteractable`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.ElementNotInteractable -[`FullscreenWindow`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.FullscreenWindow -[`GetNamedCookie`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.GetNamedCookie -[`GetWindowRect`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.GetWindowRect -[`InvalidCoordinates`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.InvalidCoordinates -[`MaximizeWindow`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.MaximizeWindow -[`MinimizeWindow`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.MinimizeWindow -[`NewSession`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.NewSession -[`NoSuchCookie`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.NoSuchCookie -[`RectResponse`]: https://docs.rs/webdriver/0.27.0/webdriver/response/struct.RectResponse.html -[`SendKeysParameters`]: https://docs.rs/webdriver/newest/webdriver/command/struct.SendKeysParameters.html -[`SessionNotCreated`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.SessionNotCreated -[`SetTimeouts`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.SetTimeouts -[`SetWindowRect`]: https://docs.rs/webdriver/newest/webdriver/command/enum.WebDriverCommand.html#variant.SetWindowRect -[`StaleElementReference`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.StaleElementReference -[`UnableToCaptureScreen`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.UnableToCaptureScreen -[`UnknownCommand`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.UnknownCommand -[`UnknownError`]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html#variant.UnknownError -[`WindowRectParameters`]: https://docs.rs/webdriver/newest/webdriver/command/struct.WindowRectParameters.html - -[Add Cookie]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Commands/AddCookie -[invalid argument]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/InvalidArgument -[invalid session id]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/InvalidSessionID -[script timeout]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/ScriptTimeout -[timeout]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/Timeout -[timeout object]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Timeouts -[`platformName` capability]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities#platformName - -[hyper]: https://hyper.rs/ -[mozrunner crate]: https://crates.io/crates/mozrunner -[serde]: https://serde.rs/ -[webdriver crate]: https://crates.io/crates/webdriver - -[Actions]: https://w3c.github.io/webdriver/webdriver-spec.html#actions -[Element Click]: https://w3c.github.io/webdriver/webdriver-spec.html#element-click -[Find Element From Shadow Root]: https://w3c.github.io/webdriver/#dfn-find-element-from-shadow-root -[Find Elements From Shadow Root]: https://w3c.github.io/webdriver/#dfn-find-elements-from-shadow-root -[Get Computed Label]: https://w3c.github.io/webdriver/#get-computed-label -[Get Computed Role]: https://w3c.github.io/webdriver/#get-computed-role -[Get Element Shadow Root]: https://w3c.github.io/webdriver/#get-element-shadow-root -[Get Timeouts]: https://w3c.github.io/webdriver/webdriver-spec.html#get-timeouts -[Get Window Rect]: https://w3c.github.io/webdriver/webdriver-spec.html#get-window-rect -[insecure certificate]: https://w3c.github.io/webdriver/webdriver-spec.html#dfn-insecure-certificate -[Minimize Window]: https://w3c.github.io/webdriver/webdriver-spec.html#minimize-window -[New Session]: https://w3c.github.io/webdriver/webdriver-spec.html#new-session -[New Window]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Commands/New_Window -[Print]: https://w3c.github.io/webdriver/webdriver-spec.html#print -[Send Alert Text]: https://w3c.github.io/webdriver/webdriver-spec.html#send-alert-text -[Set Timeouts]: https://w3c.github.io/webdriver/webdriver-spec.html#set-timeouts -[Set Window Rect]: https://w3c.github.io/webdriver/webdriver-spec.html#set-window-rect -[Status]: https://w3c.github.io/webdriver/webdriver-spec.html#status -[Take Element Screenshot]: https://w3c.github.io/webdriver/webdriver-spec.html#take-element-screenshot -[WebDriver errors]: https://w3c.github.io/webdriver/webdriver-spec.html#handling-errors - -[Bastien Orivel]: https://github.com/Eijebong -[David Burns]: https://github.com/AutomatedTester -[Jason Juang]: https://github.com/juangj -[Jeremy Lempereur]: https://github.com/o0Ignition0o -[Kalpesh Krishna]: https://github.com/martiansideofthemoon -[Kriti Singh]: https://github.com/kritisingh1 -[Mike Pennisi]: https://github.com/jugglinmike -[Nupur Baghel]: https://github.com/nupurbaghel -[Peter Major]: https://github.com/aldaris -[Shivam Singhal]: https://github.com/championshuttler -[Sven Jost]: https://github/mythsunwind -[Vlad Filippov]: https://github.com/vladikoff -[Olivier Tilloy]: https://github.com/oSoMoN diff --git a/python/drivers/geckodriver-0.33.0/CONTRIBUTING.md b/python/drivers/geckodriver-0.33.0/CONTRIBUTING.md deleted file mode 100644 index 9f3e5df..0000000 --- a/python/drivers/geckodriver-0.33.0/CONTRIBUTING.md +++ /dev/null @@ -1,2 +0,0 @@ -Please see our contributor documentation at -https://firefox-source-docs.mozilla.org/testing/geckodriver/#for-developers. diff --git a/python/drivers/geckodriver-0.33.0/Cargo.lock b/python/drivers/geckodriver-0.33.0/Cargo.lock deleted file mode 100644 index 157abfa..0000000 --- a/python/drivers/geckodriver-0.33.0/Cargo.lock +++ /dev/null @@ -1,1656 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "cc" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-integer", - "num-traits", - "time 0.1.45", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "clap" -version = "3.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" -dependencies = [ - "bitflags", - "clap_lex", - "indexmap", - "lazy_static", - "strsim", - "terminal_size", - "textwrap", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "cookie" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" -dependencies = [ - "time 0.3.20", - "version_check", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpufeatures" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cxx" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.13", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.13", -] - -[[package]] -name = "digest" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "errno" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "flate2" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-core", - "futures-sink", - "futures-task", - "pin-project-lite", - "pin-utils", -] - -[[package]] -name = "geckodriver" -version = "0.33.0" -dependencies = [ - "base64 0.13.1", - "chrono", - "clap", - "hyper", - "lazy_static", - "log", - "marionette", - "mozdevice", - "mozprofile", - "mozrunner", - "mozversion", - "regex", - "serde", - "serde_derive", - "serde_json", - "serde_yaml", - "tempfile", - "unicode-segmentation", - "url", - "uuid", - "webdriver", - "zip", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "h2" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "headers" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" -dependencies = [ - "base64 0.13.1", - "bitflags", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c17cc76786e99f8d2f055c11159e7f0091c42474dcc3189fbab96072e873e6d" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" -dependencies = [ - "cxx", - "cxx-build", -] - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - -[[package]] -name = "itoa" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" - -[[package]] -name = "js-sys" -version = "0.3.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" - -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", -] - -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "marionette" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834a6bbd4f1218f2e5588b2462b89c978841b2b64473152d15c4bbf725ac23a" -dependencies = [ - "serde", - "serde_json", - "serde_repr", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", -] - -[[package]] -name = "mozdevice" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f01c1b180a91304d9498e47120ac70498909647fefcccf9adb64ed3d6f4bf06c" -dependencies = [ - "log", - "once_cell", - "regex", - "tempfile", - "thiserror", - "unix_path", - "uuid", - "walkdir", -] - -[[package]] -name = "mozprofile" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22254a1861d33cce16327afbb5b071c819cd227aef40f382666ec537a689529" -dependencies = [ - "tempfile", -] - -[[package]] -name = "mozrunner" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8925a6f5235f6c586a1bcc79612325f2cb97c2d0da19b23ce668a60e7f6e5f" -dependencies = [ - "dirs", - "log", - "mozprofile", - "plist", - "winreg", -] - -[[package]] -name = "mozversion" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1c996f34cc52fa3de2ba1b683c35c66c279ea9f43735a179d0b0fab6c574d6" -dependencies = [ - "regex", - "rust-ini", - "semver", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" - -[[package]] -name = "os_str_bytes" -version = "6.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pin-project" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "plist" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" -dependencies = [ - "base64 0.21.0", - "indexmap", - "line-wrap", - "quick-xml", - "serde", - "time 0.3.20", -] - -[[package]] -name = "proc-macro2" -version = "1.0.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-xml" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "rust-ini" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a654c5bda722c699be6b0fe4c0d90de218928da5b724c3e467fc48865c37263" - -[[package]] -name = "rustix" -version = "0.37.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d097081ed288dfe45699b72f5b5d648e5f15d64d900c7080273baa20c16a6849" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" -dependencies = [ - "base64 0.21.0", -] - -[[package]] -name = "ryu" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scratch" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" - -[[package]] -name = "semver" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" - -[[package]] -name = "serde" -version = "1.0.159" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.159" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.13", -] - -[[package]] -name = "serde_json" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.13", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" -dependencies = [ - "indexmap", - "ryu", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall 0.3.5", - "rustix", - "windows-sys", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "terminal_size" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "textwrap" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" -dependencies = [ - "terminal_size", -] - -[[package]] -name = "thiserror" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.13", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" -dependencies = [ - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" - -[[package]] -name = "time-macros" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" -dependencies = [ - "autocfg", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys", -] - -[[package]] -name = "tokio-stream" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "unix_path" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8e291873ae77c4c8d9c9b34d0bee68a35b048fb39c263a5155e0e353783eaf" -dependencies = [ - "unix_str", -] - -[[package]] -name = "unix_str" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ace0b4755d0a2959962769239d56267f8a024fef2d9b32666b3dcd0946b0906" - -[[package]] -name = "url" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "uuid" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" -dependencies = [ - "getrandom", - "serde", -] - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "warp" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e1a710288f0f91a98dd8a74f05b76a10768db245ce183edf64dc1afdc3016c" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "headers", - "http", - "hyper", - "log", - "mime", - "mime_guess", - "percent-encoding", - "pin-project", - "rustls-pemfile", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-util", - "tower-service", - "tracing", -] - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 1.0.109", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" - -[[package]] -name = "webdriver" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9ae70f0cb12332fe144def990a9e62b20db2361b8784f879bb2814aad6c763" -dependencies = [ - "base64 0.13.1", - "bytes", - "cookie", - "http", - "log", - "serde", - "serde_derive", - "serde_json", - "time 0.3.20", - "tokio", - "tokio-stream", - "unicode-segmentation", - "url", - "warp", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zip" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef" -dependencies = [ - "byteorder", - "crc32fast", - "crossbeam-utils", - "flate2", -] diff --git a/python/drivers/geckodriver-0.33.0/Cargo.toml b/python/drivers/geckodriver-0.33.0/Cargo.toml deleted file mode 100644 index 844bc6c..0000000 --- a/python/drivers/geckodriver-0.33.0/Cargo.toml +++ /dev/null @@ -1,51 +0,0 @@ -[package] -edition = "2018" -name = "geckodriver" -version = "0.33.0" -authors = ["Mozilla"] -include = [ - "/.cargo", - "/build.rs", - "/src" - ] -description = "Proxy for using WebDriver clients to interact with Gecko-based browsers." -readme = "README.md" -keywords = [ - "firefox", - "httpd", - "mozilla", - "w3c", - "webdriver", - ] -license = "MPL-2.0" -repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/geckodriver" - -[dependencies] -base64 = "0.13" -chrono = "0.4.6" -clap = { version = "~3.1", default-features = false, features = ["cargo", "std", "suggestions", "wrap_help"] } -hyper = "0.14" -lazy_static = "1.0" -log = { version = "0.4", features = ["std"] } -marionette = "0.4.0" -mozdevice = "0.5.1" -mozprofile = "0.9.1" -mozrunner = "0.15.1" -mozversion = "0.5.1" -regex = { version="1.0", default-features = false, features = ["perf", "std"] } -serde = "1.0" -serde_derive = "1.0" -serde_json = "1.0" -serde_yaml = "0.8" -tempfile = "3" -unicode-segmentation = "1.9" -url = "2.0" -uuid = { version = "1.0", features = ["v4"] } -webdriver = "0.48.0" -zip = { version = "0.6", default-features = false, features = ["deflate"] } - -[dev-dependencies] -tempfile = "3" - -[[bin]] -name = "geckodriver" diff --git a/python/drivers/geckodriver-0.33.0/ISSUE_TEMPLATE.md b/python/drivers/geckodriver-0.33.0/ISSUE_TEMPLATE.md deleted file mode 100644 index 2b54794..0000000 --- a/python/drivers/geckodriver-0.33.0/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,31 +0,0 @@ -## System - -* Version: -* Platform: -* Firefox: -* Selenium: - - -## Testcase - - - - -## Stacktrace - - - - -## Trace-level log - - diff --git a/python/drivers/geckodriver-0.33.0/LICENSE b/python/drivers/geckodriver-0.33.0/LICENSE deleted file mode 100644 index 9c3289a..0000000 --- a/python/drivers/geckodriver-0.33.0/LICENSE +++ /dev/null @@ -1,385 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions - --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions - --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities - -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination - --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ - -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * - -************************************************************************ - -************************************************************************ - -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * - -************************************************************************ - -8. Litigation - -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous - ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License - ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at . - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/python/drivers/geckodriver-0.33.0/README.md b/python/drivers/geckodriver-0.33.0/README.md deleted file mode 100644 index 6329e48..0000000 --- a/python/drivers/geckodriver-0.33.0/README.md +++ /dev/null @@ -1,85 +0,0 @@ -geckodriver -=========== - -Proxy for using W3C [WebDriver] compatible clients to interact with -Gecko-based browsers. - -This program provides the HTTP API described by the [WebDriver -protocol] to communicate with Gecko browsers, such as Firefox. It -translates calls into the [Marionette remote protocol] by acting -as a proxy between the local- and remote ends. - -[WebDriver protocol]: https://w3c.github.io/webdriver/#protocol -[Marionette remote protocol]: https://firefox-source-docs.mozilla.org/testing/marionette/ -[WebDriver]: https://developer.mozilla.org/en-US/docs/Web/WebDriver - - -Downloads ---------- - -* [Releases](https://github.com/mozilla/geckodriver/releases/latest) -* [Change log](https://searchfox.org/mozilla-central/source/testing/geckodriver/CHANGES.md) - - -Documentation -------------- - -* [WebDriver] (work in progress) - * [Commands](https://developer.mozilla.org/en-US/docs/Web/WebDriver/Commands) - * [Errors](https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors) - * [Types](https://developer.mozilla.org/en-US/docs/Web/WebDriver/Types) - -* [Cross browser testing](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing) - -* [Selenium](https://seleniumhq.github.io/docs/) (work in progress) - * [C# API](https://seleniumhq.github.io/selenium/docs/api/dotnet/) - * [JavaScript API](https://seleniumhq.github.io/selenium/docs/api/javascript/) - * [Java API](https://seleniumhq.github.io/selenium/docs/api/java/) - * [Perl API](https://metacpan.org/pod/Selenium::Remote::Driver) - * [Python API](https://seleniumhq.github.io/selenium/docs/api/py/) - * [Ruby API](https://seleniumhq.github.io/selenium/docs/api/rb/) - -* [geckodriver usage](https://firefox-source-docs.mozilla.org/testing/geckodriver/Usage.html) - * [Supported platforms](https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html) - * [Firefox capabilities](https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html) - * [Capabilities example](https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html#capabilities-example) - * [Enabling trace logs](https://firefox-source-docs.mozilla.org/testing/geckodriver/TraceLogs.html) - * [Analyzing crash data from Firefox](https://firefox-source-docs.mozilla.org/testing/geckodriver/CrashReports.html) - -* [Contributing](https://firefox-source-docs.mozilla.org/testing/geckodriver/#for-developers) - * [Building](https://firefox-source-docs.mozilla.org/testing/geckodriver/Building.html) - * [Testing](https://firefox-source-docs.mozilla.org/testing/geckodriver/Testing.html) - * [Releasing](https://firefox-source-docs.mozilla.org/testing/geckodriver/Releasing.html) - * [Self-serving an ARM build](https://firefox-source-docs.mozilla.org/testing/geckodriver/ARM.html) - - -Source code ------------ - -geckodriver is made available under the [Mozilla Public License]. - -Its source code can be found in [mozilla-central] under testing/geckodriver. -This GitHub repository is only used for issue tracking and making releases. - -[source code]: https://hg.mozilla.org/mozilla-unified/file/tip/testing/geckodriver -[Mozilla Public License]: https://www.mozilla.org/en-US/MPL/2.0/ -[mozilla-central]: https://hg.mozilla.org/mozilla-central/file/tip/testing/geckodriver - -Custom release builds ---------------------- - -If a binary is not available for your platform, it's possibe to create a custom -build using the [Rust] toolchain. To do this, checkout the release tag for the -version of interest and run `cargo build`. Alternatively the latest version may -be built and installed from `crates.io` using `cargo install geckodriver`. - -[Rust]: https://rustup.rs/ - -Contact -------- - -The mailing list for geckodriver discussion is -https://groups.google.com/a/mozilla.org/g/dev-webdriver. - -There is also an Element channel to talk about using and developing -geckodriver on `#webdriver:mozilla.org `__ diff --git a/python/drivers/geckodriver-0.33.0/build.rs b/python/drivers/geckodriver-0.33.0/build.rs deleted file mode 100644 index eb59047..0000000 --- a/python/drivers/geckodriver-0.33.0/build.rs +++ /dev/null @@ -1,136 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Writes build information to ${OUT_DIR}/build-info.rs which is included in -// the program during compilation: -// -// ```no_run -// const COMMIT_HASH: Option<&'static str> = Some("c31a366"); -// const COMMIT_DATE: Option<&'static str> = Some("1988-05-10"); -// ``` -// -// The values are `None` if running hg failed, e.g. if it is not installed or -// if we are not in an hg repo. - -use std::env; -use std::ffi::OsStr; -use std::fs::File; -use std::io; -use std::io::Write; -use std::path::{Path, PathBuf}; -use std::process::Command; - -fn main() -> io::Result<()> { - let cur_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); - let build_info = get_build_info(&cur_dir); - - let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); - let mut fh = File::create(out_dir.join("build-info.rs"))?; - writeln!( - fh, - "const COMMIT_HASH: Option<&'static str> = {:?};", - build_info.hash() - )?; - writeln!( - fh, - "const COMMIT_DATE: Option<&'static str> = {:?};", - build_info.date() - )?; - - Ok(()) -} - -fn get_build_info(dir: &Path) -> Box { - if Path::exists(&dir.join(".hg")) { - Box::new(Hg {}) - } else if Path::exists(&dir.join(".git")) { - Box::new(Git {}) - } else if let Some(parent) = dir.parent() { - get_build_info(parent) - } else { - eprintln!("unable to detect vcs"); - Box::new(Noop {}) - } -} - -trait BuildInfo { - fn hash(&self) -> Option; - fn date(&self) -> Option; -} - -struct Hg; - -impl Hg { - fn exec(&self, args: I) -> Option - where - I: IntoIterator, - S: AsRef, - { - Command::new("hg") - .env("HGPLAIN", "1") - .args(args) - .output() - .ok() - .and_then(|r| String::from_utf8(r.stdout).ok()) - .map(|s| s.trim_end().into()) - } -} - -impl BuildInfo for Hg { - fn hash(&self) -> Option { - self.exec(["log", "-r.", "-T{node|short}"]) - } - - fn date(&self) -> Option { - self.exec(["log", "-r.", "-T{date|isodate}"]) - } -} - -struct Git; - -impl Git { - fn exec(&self, args: I) -> Option - where - I: IntoIterator, - S: AsRef, - { - Command::new("git") - .env("GIT_CONFIG_NOSYSTEM", "1") - .args(args) - .output() - .ok() - .and_then(|r| String::from_utf8(r.stdout).ok()) - .map(|s| s.trim_end().into()) - } - - fn to_hg_sha(&self, git_sha: String) -> Option { - self.exec(["cinnabar", "git2hg", &git_sha]) - } -} - -impl BuildInfo for Git { - fn hash(&self) -> Option { - self.exec(["rev-parse", "HEAD"]) - .and_then(|sha| self.to_hg_sha(sha)) - .map(|mut s| { - s.truncate(12); - s - }) - } - - fn date(&self) -> Option { - self.exec(["log", "-1", "--date=short", "--pretty=format:%cd"]) - } -} - -struct Noop; - -impl BuildInfo for Noop { - fn hash(&self) -> Option { - None - } - fn date(&self) -> Option { - None - } -} diff --git a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz deleted file mode 100644 index eb36ef1..0000000 Binary files a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz and /dev/null differ diff --git a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz deleted file mode 100644 index cda41d8..0000000 Binary files a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz and /dev/null differ diff --git a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz deleted file mode 100644 index 46bd4c0..0000000 Binary files a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz and /dev/null differ diff --git a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip deleted file mode 100644 index ae95b06..0000000 Binary files a/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip and /dev/null differ diff --git a/python/drivers/geckodriver-0.33.0/dist/geckodriver.exe b/python/drivers/geckodriver-0.33.0/dist/geckodriver.exe deleted file mode 100644 index 1b5fc2f..0000000 Binary files a/python/drivers/geckodriver-0.33.0/dist/geckodriver.exe and /dev/null differ diff --git a/python/drivers/geckodriver-0.33.0/doc/ARM.md b/python/drivers/geckodriver-0.33.0/doc/ARM.md deleted file mode 100644 index 8ae9afa..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/ARM.md +++ /dev/null @@ -1,50 +0,0 @@ -# Self-serving an ARM build - -Mozilla announced the intent to deprecate ARMv7 HF builds of -geckodriver in September 2018. This does not mean you can no longer -use geckodriver on ARM systems, and this document explains how you -can self-service a build for ARMv7 HF. - -Assuming you have already checked out [central], the steps to -cross-compile ARMv7 from a Linux host system is as follows: - - 1. If you don’t have Rust installed: - - ```shell - % curl https://sh.rustup.rs -sSf | sh - ``` - - 2. Install cross-compiler toolchain: - - ```shell - % apt install gcc-arm-linux-gnueabihf libc6-armhf-cross libc6-dev-armhf-cross - ``` - - 3. Create a new shell, or to reuse the existing shell: - - ```shell - % source $HOME/.cargo/env - ``` - - 4. Install rustc target toolchain: - - ```shell - % rustup target install armv7-unknown-linux-gnueabihf - ``` - - 5. Put this in [testing/geckodriver/.cargo/config]: - - ```rust - [target.armv7-unknown-linux-gnueabihf] - linker = "arm-linux-gnueabihf-gcc" - ``` - - 6. Build geckodriver from testing/geckodriver: - - ```shell - % cd testing/geckodriver - % cargo build --release --target armv7-unknown-linux-gnueabihf - ``` - -[central]: https://hg.mozilla.org/mozilla-central/ -[testing/geckodriver/.cargo/config]: https://searchfox.org/mozilla-central/source/testing/geckodriver/.cargo/config diff --git a/python/drivers/geckodriver-0.33.0/doc/Bugs.md b/python/drivers/geckodriver-0.33.0/doc/Bugs.md deleted file mode 100644 index b561bd4..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Bugs.md +++ /dev/null @@ -1,45 +0,0 @@ -# Reporting bugs - -When opening a new issue or commenting on existing issues, please -make sure discussions are related to concrete technical issues -with geckodriver or Marionette. Questions or discussions are more -appropriate for the [mailing list]. - -For issue reports to be actionable, it must be clear exactly -what the observed and expected behaviours are, and how to set up -the state required to observe the erroneous behaviour. The most -useful thing to provide is a minimal HTML document which permits -the problem to be reproduced along with a [trace-level log] from -geckodriver showing the exact wire protocol calls made. - -Because of the wide variety and different charateristics of clients -used with geckodriver, their stacktraces, logs, and code examples are -typically not very useful as they distract from the actual underlying -cause. **For this reason, we cannot overstate the importance of -always providing the [trace-level log] from geckodriver.** Bugs -relating to a specific client should be filed with that project. - -We welcome you to file issues in the [GitHub issue tracker] once you are -confident it has not already been reported. The [ISSUE_TEMPLATE.md] -contains a helpful checklist for things we will want to know about -the affected system, reproduction steps, and logs. - -geckodriver development follows a rolling release model as -we don’t release patches for older versions. It is therefore -useful to use the tip-of-tree geckodriver binary, or failing this, -the latest release when verifying the problem. geckodriver is only -compatible with the current release channel versions of Firefox, and -it consequently does not help to report bugs that affect outdated -and unsupported Firefoxen. Please always try to verify the issue -in the latest Firefox Nightly before you file your bug. - -Once we are satisfied the issue raised is of sufficiently actionable -character, we will continue with triaging it and file a bug where it -is appropriate. Bugs specific to geckodriver will be filed in the -[`Testing :: geckodriver`] component in Bugzilla. - -[mailing list]: index.rst/#communication -[trace-level log]: TraceLogs.md -[GitHub issue tracker]: https://github.com/mozilla/geckodriver/issues -[ISSUE_TEMPLATE.md]: https://raw.githubusercontent.com/mozilla/geckodriver/master/ISSUE_TEMPLATE.md -[`Testing :: geckodriver`]: https://bugzilla.mozilla.org/buglist.cgi?component=geckodriver diff --git a/python/drivers/geckodriver-0.33.0/doc/Building.md b/python/drivers/geckodriver-0.33.0/doc/Building.md deleted file mode 100644 index 49a5a51..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Building.md +++ /dev/null @@ -1,46 +0,0 @@ -# Building geckodriver - -geckodriver is written in [Rust], a systems programming language -from Mozilla. Crucially, it relies on the [webdriver crate] to -provide the HTTPD and do most of the heavy lifting of marshalling -the WebDriver protocol. geckodriver translates WebDriver [commands], -[responses], and [errors] to the [Marionette protocol], and acts -as a proxy between [WebDriver] and [Marionette]. - -To build geckodriver: - -```shell -% ./mach build testing/geckodriver -``` - -If you use artifact builds you may build geckodriver using cargo, -since mach in this case does not have a compile environment: - -```shell -% cd testing/geckodriver -% cargo build -… -Compiling geckodriver v0.21.0 (file:///code/gecko/testing/geckodriver) -… -Finished dev [optimized + debuginfo] target(s) in 7.83s -``` - -Because all Rust code in central shares the same cargo workspace, -the binary will be put in the `$(topsrcdir)/target` directory. - -You can run your freshly built geckodriver this way: - -```shell -% ./mach geckodriver -- --other --flags -``` - -See [Testing](Testing.md) for how to run tests. - -[Rust]: https://www.rust-lang.org/ -[webdriver crate]: https://crates.io/crates/webdriver -[commands]: https://docs.rs/webdriver/newest/webdriver/command/ -[responses]: https://docs.rs/webdriver/newest/webdriver/response/ -[errors]: https://docs.rs/webdriver/newest/webdriver/error/enum.ErrorStatus.html -[Marionette protocol]: /testing/marionette/Protocol.md -[WebDriver]: https://w3c.github.io/webdriver/ -[Marionette]: /testing/marionette/index.rst diff --git a/python/drivers/geckodriver-0.33.0/doc/Capabilities.md b/python/drivers/geckodriver-0.33.0/doc/Capabilities.md deleted file mode 100644 index c9eb7a5..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Capabilities.md +++ /dev/null @@ -1,98 +0,0 @@ -# Firefox capabilities - -geckodriver has a few capabilities that are specific to Firefox. -Most of these [are documented on MDN](https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions). - -We additionally have some capabilities that largely are implementation -concerns that normal users should not care about: - -## `moz:debuggerAddress` - -A boolean value to indicate if Firefox has to be started with the -[Remote Protocol] enabled, which is a low-level debugging interface that -implements a subset of the [Chrome DevTools Protocol] (CDP). - -When enabled the returned `moz:debuggerAddress` capability of the `New Session` -command is the `host:port` combination of a server that supports the following -HTTP endpoints: - -### GET /json/version - -The browser version metadata: - -```json -{ - "Browser": "Firefox/84.0a1", - "Protocol-Version": "1.0", - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0", - "V8-Version": "1.0", - "WebKit-Version": "1.0", - "webSocketDebuggerUrl": "ws://localhost:9222/devtools/browser/fe507083-2960-a442-bbd7-7dfe1f111c05" -} -``` - -### GET /json/list - -A list of all available websocket targets: - -```json -[ { - "description": "", - "devtoolsFrontendUrl": null, - "faviconUrl": "", - "id": "ecbf9028-676a-1b40-8596-a5edc0e2875b", - "type": "page", - "url": "https://www.mozilla.org/en-US/", - "browsingContextId": 29, - "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/ecbf9028-676a-1b40-8596-a5edc0e2875b" -} ] -``` - -The contained `webSocketDebuggerUrl` entries can be used to connect to the -websocket and interact with the browser by using the CDP protocol. - -[Remote Protocol]: /remote/index.rst -[Chrome DevTools Protocol]: https://chromedevtools.github.io/devtools-protocol/ - -## `moz:useNonSpecCompliantPointerOrigin` - -A boolean value to indicate how the pointer origin for an action -command will be calculated. - -With Firefox 59 the calculation will be based on the requirements -by the [WebDriver] specification. This means that the pointer origin -is no longer computed based on the top and left position of the -referenced element, but on the in-view center point. - -To temporarily disable the WebDriver conformant behavior use `false` -as value for this capability. - -Please note that this capability exists only temporarily, and that -it will be removed once all Selenium bindings can handle the new -behavior. - -## `moz:webdriverClick` - -A boolean value to indicate which kind of interactability checks -to run when performing a click or sending keys to an elements. For -Firefoxen prior to version 58.0 some legacy code as imported from -an older version of FirefoxDriver was in use. - -With Firefox 58 the interactability checks as required by the -[WebDriver] specification are enabled by default. This means -geckodriver will additionally check if an element is obscured by -another when clicking, and if an element is focusable for sending -keys. - -Because of this change in behaviour, we are aware that some extra -errors could be returned. In most cases the test in question might -have to be updated so it's conform with the new checks. But if the -problem is located in geckodriver, then please raise an issue in -the [issue tracker]. - -To temporarily disable the WebDriver conformant checks use `false` -as value for this capability. - -Please note that this capability exists only temporarily, and that -it will be removed once the interactability checks have been -stabilized. diff --git a/python/drivers/geckodriver-0.33.0/doc/CrashReports.md b/python/drivers/geckodriver-0.33.0/doc/CrashReports.md deleted file mode 100644 index 576bdda..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/CrashReports.md +++ /dev/null @@ -1,67 +0,0 @@ -# Analyzing crash data of Firefox - -It's not uncommon that under some special platform configurations and while -running automated tests via Selenium and geckodriver Firefox could crash. In -those cases it is very helpful to retrieve the generated crash data aka -minidump files, and report these to us. - -## Retrieve the crash data - -Because geckodriver creates a temporary user profile for Firefox, it also -automatically removes all its folders once the tests have been finished. That -also means that if Firefox crashed the created minidump files are lost. To -prevent that a custom profile has to be used instead. The following code -shows an example by using the Python Selenium bindings on Mac OS: - -```python -import tempfile - -from selenium import webdriver -from selenium.webdriver.firefox.options import Options - -# Custom profile folder to keep the minidump files -profile = tempfile.mkdtemp(".selenium") -print("*** Using profile: {}".format(profile)) - -# Use the above folder as custom profile -opts = Options() -opts.add_argument("-profile") -opts.add_argument(profile) -opts.binary = "/Applications/Firefox.app/Contents/MacOS/firefox" - -driver = webdriver.Firefox( - options=opts, - # hard-code the Marionette port so geckodriver can connect - service_args=["--marionette-port", "2828"] -) - -# Your test code which crashes Firefox -``` - -Executing the test with Selenium now, which triggers the crash of Firefox -will leave all the files from the user profile around in the above path. - -To retrieve the minidump files navigate to that folder and look for a sub -folder with the name `minidumps`. It should contain at least one series of -files. One file with the `.dmp` extension and another one with `.extra`. -Both of those files are needed. If more crash files are present grab them all. - -Attach the files as best archived as zip file to the created [geckodriver issue] -on Github. - -[geckodriver issue]: https://github.com/mozilla/geckodriver/issues/new - -## Getting details of the crash - -More advanced users can upload the generated minidump files themselves and -receive details information about the crash. Therefore find the [crash reporter] -folder and copy all the generated minidump files into the `pending` sub directory. -Make sure that both the `.dmp` and `.extra` files are present. - -Once done you can also [view the crash reports]. - -If you submitted a crash please do not forget to also add the link of the -crash report to the geckodriver issue. - -[crash reporter]: https://support.mozilla.org/kb/mozillacrashreporter#w_viewing-reports-outside-of-firefox -[view the crash reports]: https://support.mozilla.orgkb/mozillacrashreporter#w_viewing-crash-reports diff --git a/python/drivers/geckodriver-0.33.0/doc/Flags.md b/python/drivers/geckodriver-0.33.0/doc/Flags.md deleted file mode 100644 index 9c11ce5..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Flags.md +++ /dev/null @@ -1,218 +0,0 @@ - -# Flags - -## --allow-hosts ALLOW_HOSTS... - -Values of the `Host` header to allow for incoming requests. - -By default the value of HOST is allowed. If `--allow-hosts` -is provided, exactly the given values will be permitted. For example -`--allow-host geckodriver.test webdriver.local` will allow requests -with `Host` set to `geckodriver.test` or `webdriver.local`. - -Requests with `Host` set to an IP address are always allowed. - -## --allow-origins ALLOW_ORIGINS... - -Values of the `Origin` header to allow for incoming requests. - -`Origin` is set by web browsers for all `POST` requests, and most -other cross-origin requests. By default any request with an `Origin` -header is rejected to protect against malicious websites trying to -access geckodriver running on the local machine. - -If `--allow-origins` is provided, web services running on the given -origin will be able to make requests to geckodriver. For example -`--allow-origins https://webdriver.test:8080` will allow a web-based -service on the origin with scheme `https`, hostname `webdriver.test`, -and port `8080` to access the geckodriver instance. - -## --android-storage ANDROID_STORAGE - -**Deprecation warning**: This argument is deprecated and planned to be removed -with the 0.31.0 release of geckodriver. As such it shouldn't be used with version -0.30.0 or later anymore. By default the automatic detection will now use the -external storage location, which is always readable and writeable. - -Selects the test data location on the Android device, eg. the Firefox profile. -By default `auto` is used. - - - - - - - - - - - - - -
Value - Description -
auto - Best suitable location based on whether the device is rooted.
- If the device is rooted internal is used, otherwise app. -
app -

Location: /data/data/%androidPackage%/test_root

- Based on the androidPackage capability that is passed as part of - moz:firefoxOptions when creating a new session. Commands that - change data in the app's directory are executed using run-as. This requires - that the installed app is debuggable. -
internal -

Location: /data/local/tmp/test_root

- The device must be rooted since when the app runs, files that are created - in the profile, which is owned by the app user, cannot be changed by the - shell user. Commands will be executed via su. -
sdcard -

Location: $EXTERNAL_STORAGE/Android/data/%androidPackage%/files/test_root

- This location is supported by all versions of Android whether if the device - is rooted or not. -
- -## -b BINARY / --binary BINARY - -Path to the Firefox binary to use. By default geckodriver tries to -find and use the system installation of Firefox, but that behaviour -can be changed by using this option. Note that the `binary` -capability of the `moz:firefoxOptions` object that is passed when -[creating a new session] will override this option. - -On Linux systems it will use the first _firefox_ binary found -by searching the `PATH` environmental variable, which is roughly -equivalent to calling [whereis(1)] and extracting the second column: - -```shell -% whereis firefox -firefox: /usr/bin/firefox /usr/local/firefox -``` - -On macOS, the binary is found by looking for the first _firefox-bin_ -binary in the same fashion as on Linux systems. This means it is -possible to also use `PATH` to control where geckodriver should -find Firefox on macOS. It will then look for _/Applications/Firefox.app_. - -On Windows systems, geckodriver looks for the system Firefox by -scanning the Windows registry. - -[creating a new session]: https://w3c.github.io/webdriver/#new-session -[whereis(1)]: http://www.manpagez.com/man/1/whereis/ - -## --connect-existing - -Connect geckodriver to an existing Firefox instance. This means -geckodriver will abstain from the default of starting a new Firefox -session. - -The existing Firefox instance must have [Marionette] enabled. -To enable the remote protocol in Firefox, you can pass the -`-marionette` flag. Unless the `marionette.port` preference -has been user-set, Marionette will listen on port 2828. So when -using `--connect-existing` it is likely you will also have to use -`--marionette-port` to set the correct port. - -`--marionette-port`: #marionette-port - -## --host HOST - -Host to use for the WebDriver server. Defaults to 127.0.0.1. - -## --jsdebugger - -Attach [browser toolbox] debugger when Firefox starts. This is -useful for debugging [Marionette] internals. - -To be prompted at the start of the test run or between tests, -you can set the `marionette.debugging.clicktostart` preference to -`true`. - -For reference, below is the list of preferences that enables the -chrome debugger. These are all set implicitly when the -argument is passed to geckodriver. - -* `devtools.browsertoolbox.panel` -> `jsdebugger` - - Selects the Debugger panel by default. - -* `devtools.chrome.enabled` → true - - Enables debugging of chrome code. - -* `devtools.debugger.prompt-connection` → false - - Controls the remote connection prompt. Note that this will - automatically expose your Firefox instance to localhost. - -* `devtools.debugger.remote-enabled` → true - - Allows a remote debugger to connect, which is necessary for - debugging chrome code. - -[browser toolbox]: https://developer.mozilla.org/en-US/docs/Tools/Browser_Toolbox - -## --log LEVEL - -Set the Gecko and geckodriver log level. Possible values are `fatal`, -`error`, `warn`, `info`, `config`, `debug`, and `trace`. - -## --log-no-truncate - -Disables truncation of long log lines. - -## --marionette-host HOST - -Selects the host for geckodriver’s connection to the [Marionette] -remote protocol. Defaults to 127.0.0.1. - -## --marionette-port PORT - -Selects the port for geckodriver’s connection to the [Marionette] -remote protocol. - -In the default mode where geckodriver starts and manages the Firefox -process, it will pick a free port assigned by the system and set the -`marionette.port` preference in the profile. - -When `--connect-existing` is used and the Firefox process is not -under geckodriver’s control, it will simply connect to PORT. - -`--connect-existing`: #connect-existing - -## -p PORT / --port PORT - -Port to use for the WebDriver server. Defaults to 4444. - -A helpful trick is that it is possible to bind to 0 to get the -system to atomically assign a free port. - -## --profile-root PROFILE_ROOT - -Path to the directory to use when creating temporary profiles. By -default this is the system temporary directory. Both geckodriver and -Firefox must have read-write access to this path. - -This setting can be useful when Firefox is sandboxed from the host -filesystem such that it doesn't share the same system temporary -directory as geckodriver (e.g. when running Firefox inside a container -or packaged as a snap). - -## -v[v] - -Increases the logging verbosity by to debug level when passing -a single `-v`, or to trace level if `-vv` is passed. This is -analogous to passing `--log debug` and `--log trace`, respectively. - -## --websocket-portPORT - -Port to use to connect to WebDriver BiDi. Defaults to 9222. - -A helpful trick is that it is possible to bind to 0 to get the -system to atomically assign a free port. - -[Marionette]: /testing/marionette/index.rst diff --git a/python/drivers/geckodriver-0.33.0/doc/Notarization.md b/python/drivers/geckodriver-0.33.0/doc/Notarization.md deleted file mode 100644 index ba1ba08..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Notarization.md +++ /dev/null @@ -1,44 +0,0 @@ -# MacOS notarization - -With the introduction of macOS 10.15 “Catalina” Apple introduced -[new notarization requirements] that all software must be signed -and notarized centrally. - -Whilst the geckodriver binary is technically both signed and notarized, the -actual validation can only be performed by MacOS if the machine that starts -the geckodriver binary for the very first time is online. Offline validation -would require shipping geckodriver as a DMG/PKG. You can track the relevant -progress in [bug 1783943]. - -Note: geckodriver releases between 0.26.0 and 0.31.0 don't have the -notarization applied and always require the manual steps below to -bypass the notarization requirement of the binary during the very first start. - -[new notarization requirements]: https://developer.apple.com/news/?id=04102019a -[bug 1783943]: https://bugzilla.mozilla.org/show_bug.cgi?id=1783943 - -## Offline mode - -There are some mitigating circumstances: - -* Verification problems only occur when other notarized programs, - such as a web browser, downloads the software from the internet. - -* Arbitrary software downloaded through other means, such as - curl(1) is _not_ affected by this change. - -In other words, if your method for fetching geckodriver on macOS -is through the GitHub web UI using a web browser, the program will -not be able to run unless you manually disable the quarantine check -(explained below). If downloading geckodriver via other means -than a macOS notarized program, you should not be affected. - -To bypass the notarization requirement on macOS if you have downloaded -the geckodriver .tar.gz via a web browser, you can run the following -command in a terminal: - - % xattr -r -d com.apple.quarantine geckodriver - -A problem with notarization will manifest itself through a security -dialogue appearing, explaining that the source of the program is -not trusted. diff --git a/python/drivers/geckodriver-0.33.0/doc/Patches.md b/python/drivers/geckodriver-0.33.0/doc/Patches.md deleted file mode 100644 index e559da0..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Patches.md +++ /dev/null @@ -1,31 +0,0 @@ -# Submitting patches - -You can submit patches by using [Phabricator]. Walk through its documentation -in how to set it up, and uploading patches for review. Don't worry about which -person to select for reviewing your code. It will be done automatically. - -Please also make sure to follow the [commit creation guidelines]. - -Once you have contributed a couple of patches, we are happy to sponsor you in -[becoming a Mozilla committer]. When you have been granted commit access -level 1, you will have permission to use the [Firefox CI] to trigger your own -“try runs” to test your changes. You can use the following [try preset] to run -the most relevant tests: - -```shell -% ./mach try --preset geckodriver -``` - -This preset will schedule geckodriver-related tests on various platforms. You can -reduce the number of tasks by filtering on platforms (e.g. linux) or build type -(e.g. opt): - -```shell -% ./mach try --preset geckodriver -xq "'linux 'opt" -``` - -[Phabricator]: https://moz-conduit.readthedocs.io/en/latest/phabricator-user.html -[commit creation guidelines]: https://mozilla-version-control-tools.readthedocs.io/en/latest/devguide/contributing.html?highlight=phabricator#submitting-patches-for-review -[becoming a Mozilla committer]: https://www.mozilla.org/en-US/about/governance/policies/commit/ -[Firefox CI]: https://treeherder.mozilla.org/ -[try preset]: https://firefox-source-docs.mozilla.org/tools/try/presets.html diff --git a/python/drivers/geckodriver-0.33.0/doc/Profiles.md b/python/drivers/geckodriver-0.33.0/doc/Profiles.md deleted file mode 100644 index abad9af..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Profiles.md +++ /dev/null @@ -1,103 +0,0 @@ -# Profiles - -geckodriver uses [profiles] to instrument Firefox’ behaviour. The -user will usually rely on geckodriver to generate a temporary, -throwaway profile. These profiles are deleted when the WebDriver -session expires. - -In cases where the user needs to use custom, prepared profiles, -geckodriver will make modifications to the profile that ensures -correct behaviour. See [_Automation preferences_] below on the -precedence of user-defined preferences in this case. - -Custom profiles can be provided two different ways: - - 1. by appending `--profile /some/location` to the [`args` capability], - which will instruct geckodriver to use the profile _in-place_; - - 2. or by setting the [`profile` capability] to a Base64-encoded - ZIP of the profile directory. - -Note that geckodriver has a [known bug concerning `--profile`] that -prevents the randomised Marionette port from being passed to -geckodriver. To circumvent this issue, make sure you specify the -port manually using `--marionette-port `. - -The second way is compatible with shipping Firefox profiles across -a network, when for example the geckodriver instance is running on -a remote system. This is the case when using Selenium’s `RemoteWebDriver` -concept, where the WebDriver client and the server are running on -two distinct systems. - -[profiles]: https://support.mozilla.org/en-US/kb/profiles-where-firefox-stores-user-data -[_Automation preferences_]: #automation-preferences -[`args` capability]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions#args_array_of_strings -[`profile` capability]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions#profile_string -[known bug concerning `--profile`]: https://github.com/mozilla/geckodriver/issues/1058 - -## Default locations for temporary profiles - -When a custom user profile is not provided with the `-profile` -command-line argument geckodriver generates a temporary, throwaway -profile. This is written to the default system temporary folder -and subsequently removed when the WebDriver session expires. - -The default location for temporary profiles depends on the system. -On Unix systems it uses /tmp, and on Windows it uses the Windows -directory. - -The default location can be overridden. On Unix you set the `TMPDIR` -environment variable. On Windows, the following environment variables -are respected, in order: - - 1. `TMP` - 2. `TEMP` - 3. `USERPROFILE` - -It is not necessary to change the temporary directory system-wide. -All you have to do is make sure it gets set for the environment of -the geckodriver process: - - TMPDIR=/some/location ./geckodriver - -## Automation preferences - -As indicated in the introduction, geckodriver configures Firefox -so it is well-behaved in automation environments. It uses a -combination of preferences written to the profile prior to launching -Firefox (1), and a set of recommended preferences set on startup (2). - -These can be perused here: - - 1. [testing/geckodriver/src/prefs.rs](https://searchfox.org/mozilla-central/source/testing/geckodriver/src/prefs.rs) - 2. [remote/components/marionette.js](https://searchfox.org/mozilla-central/source/remote/components/marionette.js) - -As mentioned, these are _recommended_ preferences, and any user-defined -preferences in the [user.js file] or as part of the [`prefs` capability] -take precedence. This means for example that the user can tweak -`browser.startup.page` to override the recommended preference for -starting the browser with a blank page. - -The recommended preferences set at runtime (see 2 above) may also -be disabled entirely by setting `remote.prefs.recommended` starting with Firefox -91. For older versions of Firefox, the preference to use was -`marionette.prefs.recommended`. -This may however cause geckodriver to not behave correctly according -to the WebDriver standard, so it should be used with caution. - -Users should take note that the `marionette.port` preference is -special, and will always be overridden when using geckodriver unless -the `--marionette-port ` flag is used specifically to instruct -the Marionette server in Firefox which port to use. - -[user.js file]: http://kb.mozillazine.org/User.js_file -[`prefs` capability]: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions#prefs_preferences_object - -## Temporary profiles not being removed - -It is a known bug that geckodriver in some instances fails to remove -the temporary profile, particularly when the session is not explicitly -deleted or the process gets interrupted. See [geckodriver issue -299] for more information. - -[geckodriver issue 299]: https://github.com/mozilla/geckodriver/issues/299 diff --git a/python/drivers/geckodriver-0.33.0/doc/Releasing.md b/python/drivers/geckodriver-0.33.0/doc/Releasing.md deleted file mode 100644 index 79574f8..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Releasing.md +++ /dev/null @@ -1,292 +0,0 @@ -# Releasing geckodriver - -Releasing geckodriver is not as easy as it once used to be when the -project’s canonical home was on GitHub. Today geckodriver is hosted -in [mozilla-central], and whilst we do want to make future releases -from [Mozilla’s CI infrastructure], we are currently in between two -worlds: development happens in m-c, but releases continue to be made -from GitHub. - -In any case, the steps to release geckodriver are as follows: - -[mozilla-central]: https://hg.mozilla.org/mozilla-central/ -[Mozilla’s CI infrastructure]: https://treeherder.mozilla.org/ - -## Update in-tree dependency crates - -geckodriver depends on a number of Rust crates that also live in -central by using relative paths. Here an excerpt from its `Cargo.toml`: - -```ini -[dependencies] -… -marionette = { path = "./marionette" } -… -mozdevice = { path = "../mozbase/rust/mozdevice" } -mozprofile = { path = "../mozbase/rust/mozprofile" } -mozrunner = { path = "../mozbase/rust/mozrunner" } -mozversion = { path = "../mozbase/rust/mozversion" } -… -webdriver = { path = "../webdriver" } -``` - -Because we need to export the geckodriver source code to the old -GitHub repository when we release, we first need to publish these -crates in the specified order if they have had any changes in the -interim since the last release. If they have received no changes, -you can skip them: - -- `testing/mozbase/rust/mozdevice` -- `testing/mozbase/rust/mozprofile` -- `testing/mozbase/rust/mozrunner` -- `testing/mozbase/rust/mozversion` -- `testing/webdriver` -- `testing/geckodriver/marionette` - -For each crate: - -1. Change into the crates folder. -2. Bump the version number in `Cargo.toml` based on [semantic versioning rules], - and also update the version dependency for other in-tree crates using the - currently modified crate. Note that running `cargo update` will fail if you - missed updating a crate's dependency. - -3. Use the [cargo-semver-checks] command to validate the version change: - - ```shell - % cargo semver-checks check-release - ``` - -4. Update the crate: - - ```shell - % cargo update -p - ``` - -5. We also publish audit information for the crates based on Mozilla's - [audit criteria]. Because we use [wildcard audit entries] make sure that the - latest day of publication is still within the `end` date. The related entry - of the crate can be found at the top of [audits.toml]. If the date is over, - then update its value to at most 1 year in the future. - -6. Commit the changes for the modified [Cargo.toml] files, [Cargo.lock] and - [audits.toml]. - - ```shell - % git add Cargo.toml Cargo.lock audits.toml testing - % git commit -m "Bug XYZ - [rust-] Release version " - ``` - -[semantic versioning rules]: https://semver.org/ -[cargo-semver-checks]: https://crates.io/crates/cargo-semver-checks -[audit criteria]: https://mozilla.github.io/cargo-vet/audit-criteria.html -[wildcard audit entries]: https://mozilla.github.io/cargo-vet/wildcard-audit-entries.html -[Cargo.toml]: https://searchfox.org/mozilla-central/source/testing/geckodriver/Cargo.toml -[Cargo.lock]: https://searchfox.org/mozilla-central/source/Cargo.lock -[audits.toml]: https://searchfox.org/mozilla-central/source/supply-chain/audits.toml - -## Update the change log - -Notable changes to geckodriver are mentioned in [CHANGES.md]. Many -users rely on this, so it’s important that you make it **relevant -to end-users**. For example, we only mention changes that are visible -to users. The change log is not a complete anthology of commits, -as these often will not convey the essence of a change to end-users. -If a feature was added but removed before release, there is no reason -to list it as a change. - -It is good practice to also include relevant information from the -[webdriver], [marionette], [rust-mozrunner], and [rust-mozdevice] crates, -since these are the most important dependencies of geckodriver and a lot -of its functionality is implemented there. - -To get a list of all the changes for one of the above crates one of the following -commands can be used: - -```shell -% hg log -M -r ::central --template "{node|short}\t{desc|firstline}\n" -% git log --reverse $(git cinnabar hg2git )..HEAD --pretty="%s" -``` - -where `` is the changeset of the last geckodriver release and `` -the location of the crate in the repository. - -Add the list of changes to the related release bug on Bugzilla, and also check the -dependency list of the bug for other fixes that are worth mentioning. - -We follow the writing style of the existing change log, with -one section per version (with a release date), with subsections -‘Added’, ‘Changed’, 'Fixed' and ‘Removed’. If the targeted -Firefox or Selenium versions have changed, it is good to make a -mention of this. Lines are optimally formatted at roughly 72 columns -to make the file readable in a text editor as well as rendered HTML. -fmt(1) does a splendid job at text formatting. - -[CHANGES.md]: https://searchfox.org/mozilla-central/source/testing/geckodriver/CHANGES.md -[webdriver]: https://searchfox.org/mozilla-central/source/testing/webdriver -[marionette]: https://searchfox.org/mozilla-central/source/testing/geckodriver/marionette -[rust-mozrunner]: https://searchfox.org/mozilla-central/source/testing/mozbase/rust/mozrunner -[rust-mozdevice]: https://searchfox.org/mozilla-central/source/testing/mozbase/rust/mozdevice - -## Bump the version number and update the support page - -Bump the version number in [Cargo.toml] to the next version. -geckodriver follows [semantic versioning] so it’s a good idea to -familiarise yourself with that before deciding on the version number. - -After you’ve changed the version number, run - -```shell -% ./mach build testing/geckodriver -``` - -again to update [Cargo.lock]. - -Now update the [support page] by adding a new row to the versions table, -including the required versions of Selenium, and Firefox. - -Finally commit all those changes. - -[semantic versioning]: http://semver.org/ -[support page]: https://searchfox.org/mozilla-central/source/testing/geckodriver/doc/Support.md - -## Add the changeset id - -To easily allow a release build of geckodriver after cloning the -repository, the changeset id for the release has to be added to the -change log. Therefore add a final place-holder commit to the patch -series, to already get review for. - -Once all previous revisions of the patch series have been landed, and got merged -to `mozilla-central`, the changeset id from the merge commit has to picked for -finalizing the change log. This specific id is needed because Taskcluster creates -the final signed builds based on that merge. - -## Release new in-tree dependency crates - -Make sure to wait until the complete patch series from above has been -merged to mozilla-central. Then continue with the following steps. - -Before releasing geckodriver all dependency crates as -[updated earlier](#update-in-tree-dependency-crates) have to be -released first. - -Therefore change into each of the directories for crates with an update -and run the following command to publish the crate: - -```shell -% cargo publish -``` - -Note that if a crate has an in-tree dependency make sure to first -change the dependency information. - -Do not release the geckodriver crate yet! - -Once all crates have been published observe the `/target/package/` folder under -the root of the mozilla-central repository and remove all the folders related -to the above published packages (it will save ~1GB disk space). - -## Export to GitHub - -The canonical GitHub repository is -so make sure you have a local clone of that. It has three branches: -_master_ which only contains the [README.md]; _old_ which was the -state of the project when it was exported to mozilla-central; and -_release_, from where releases are made. - -Before we copy the code over to the GitHub repository we need to -check out the [release commit that bumped the version number](#add-the-changeset-id) -on mozilla-central: - -```shell -% hg update $RELEASE_REVISION -``` - -Or: - -```shell -% git checkout $(git cinnabar hg2git $RELEASE_REVISION) -``` - -We will now export the contents of [testing/geckodriver] to a new branch that -is based on the _release_ branch, which will be used to create a pull request: - -```shell -% cd $SRC/geckodriver -% git checkout release -% git pull -% git checkout -b do_release_X.Y.Z -% git rm -rf . -% git clean -fxd -% cp -rt $SRC/gecko/testing/geckodriver . -``` - -Now verify that geckodriver builds correctly by running: - -```shell -% cargo build -``` - -[README.md]: https://searchfox.org/mozilla-central/source/testing/geckodriver/README.md -[testing/geckodriver]: https://searchfox.org/mozilla-central/source/testing/geckodriver - -## Commit local changes - -Now commit all the changes you have made locally to the _release_ branch. -It is recommended to setup a [GPG key] for signing the commit, so -that the release commit is marked as `verified`. - -```shell -% git add . -- ':!mach_commands.py :!moz.build :!target/*' -% git commit -S -am "Import of vX.Y.Z" (signed) -``` - -or if you cannot use signing use: - -```shell -% git add . -- ':!mach_commands.py :!moz.build :!target/*' -% git commit -am "Import of vX.Y.Z" (unsigned) -``` - -Then push the changes, and create a pull request: - -```shell -% git push origin do_release_X.Y.Z -``` - -As indicated above, the changes you make to this branch will not -be upstreamed back into mozilla-central. It is merely used as a -place for external consumers to build their own version of geckodriver. - -[GPG key]: https://help.github.com/articles/signing-commits/ - -## Make the release - -geckodriver needs to be manually released on github.com. Therefore start to -[draft a new release], and make the following changes: - -1. Specify the "Tag version", and select "Release" as target. - -2. Leave the release title empty - -3. Paste the raw Markdown source from [CHANGES.md] into the description field. - This will highlight for end-users what changes were made in that particular - package when they visit the GitHub downloads section. Make sure to check that - all references can be resolved, and if not make sure to add those too. - -4. Find the signed geckodriver archives in the [taskcluster index] by - replacing %changeset% with the full release changeset id. Rename the - individual files so the basename looks like 'geckodriver-v%version%-%platform%'. - Upload them all, including the checksum files for the Linux platforms. - -5. Before announcing the release on GitHub publish the geckodriver crate as well - on crates.io by running `cargo publish` from the release branch. - -6. Send the release announcement to the [dev-webdriver] mailing list. - -[draft a new release]: https://github.com/mozilla/geckodriver/releases/new -[taskcluster index]: https://firefox-ci-tc.services.mozilla.com/tasks/index/gecko.v2.mozilla-central.revision.%changeset%.geckodriver -[dev-webdriver]: https://groups.google.com/a/mozilla.org/g/dev-webdriver - -Congratulations! You’ve released geckodriver! diff --git a/python/drivers/geckodriver-0.33.0/doc/Support.md b/python/drivers/geckodriver-0.33.0/doc/Support.md deleted file mode 100644 index 0c06ee1..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Support.md +++ /dev/null @@ -1,183 +0,0 @@ - -# Supported platforms - -The following table shows a mapping between [geckodriver releases], -and required versions of Selenium and Firefox: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
geckodriver - Selenium - Firefox -
min - max -
0.33.0 - ≥ 3.11 (3.14 Python) - 102 ESR - n/a -
0.32.2 - ≥ 3.11 (3.14 Python) - 102 ESR - n/a -
0.32.1 - ≥ 3.11 (3.14 Python) - 102 ESR - n/a -
0.32.0 - ≥ 3.11 (3.14 Python) - 102 ESR - n/a -
0.31.0 - ≥ 3.11 (3.14 Python) - 91 ESR - n/a -
0.30.0 - ≥ 3.11 (3.14 Python) - 78 ESR - 90 -
0.29.1 - ≥ 3.11 (3.14 Python) - 60 - 90 -
0.29.0 - ≥ 3.11 (3.14 Python) - 60 - 90 -
0.28.0 - ≥ 3.11 (3.14 Python) - 60 - 90 -
0.27.0 - ≥ 3.11 (3.14 Python) - 60 - 90 -
0.26.0 - ≥ 3.11 (3.14 Python) - 60 - 90 -
0.25.0 - ≥ 3.11 (3.14 Python) - 57 - 90 -
0.24.0 - ≥ 3.11 (3.14 Python) - 57 - 79 -
0.23.0 - ≥ 3.11 (3.14 Python) - 57 - 79 -
0.22.0 - ≥ 3.11 (3.14 Python) - 57 - 79 -
0.21.0 - ≥ 3.11 (3.14 Python) - 57 - 79 -
0.20.1 - ≥ 3.5 - 55 - 62 -
0.20.0 - ≥ 3.5 - 55 - 62 -
0.19.1 - ≥ 3.5 - 55 - 62 -
0.19.0 - ≥ 3.5 - 55 - 62 -
0.18.0 - ≥ 3.4 - 53 - 62 -
0.17.0 - ≥ 3.4 - 52 - 62 -
- -## Clients - -[Selenium] users must update to version 3.11 or later to use geckodriver. -Other clients that follow the [W3C WebDriver specification][WebDriver] -are also supported. - -## Firefoxen - -geckodriver is not yet feature complete. This means that it does -not yet offer full conformance with the [WebDriver] standard -or complete compatibility with [Selenium]. You can track the -[implementation status] of the latest [Firefox Nightly] on MDN. -We also keep track of known [Selenium], [remote protocol], and -[specification] problems in our [issue tracker]. - -Support is best in Firefox 57 and greater, although generally the more -recent the Firefox version, the better the experience as they have -more bug fixes and features. Some features will only be available -in the most recent Firefox versions, and we strongly advise using the -latest [Firefox Nightly] with geckodriver. Since Windows XP support -in Firefox was dropped with Firefox 53, we do not support this platform. - -## Android - -Starting with the 0.26.0 release geckodriver is able to connect -to Android devices, and to control packages which are based on [GeckoView] -(eg. [Firefox Preview] aka Fenix, or [Firefox Reality]). But it also still -supports versions of Fennec up to 68 ESR, which is the last officially -supported release from Mozilla. - -To run tests on Android specific capabilities under `moz:firefoxOptions` -have to be set when requesting a new session. See the Android section under -[Firefox Capabilities](Capabilities.md#android) for more details. - -[geckodriver releases]: https://github.com/mozilla/geckodriver/releases -[Selenium]: https://github.com/seleniumhq/selenium -[WebDriver]: https://w3c.github.io/webdriver/ -[implementation status]: https://bugzilla.mozilla.org/showdependencytree.cgi?id=721859&hide_resolved=1 -[remote protocol]: https://github.com/mozilla/geckodriver/issues?q=is%3Aissue+is%3Aopen+label%3Amarionette -[specification]: https://github.com/mozilla/geckodriver/issues?q=is%3Aissue+is%3Aopen+label%3Aspec -[issue tracker]: https://github.com/mozilla/geckodriver/issues -[Firefox Nightly]: https://nightly.mozilla.org/ -[GeckoView]: https://wiki.mozilla.org/Mobile/GeckoView -[Firefox Preview]: https://play.google.com/store/apps/details?id=org.mozilla.fenix -[Firefox Reality]: https://play.google.com/store/apps/details?id=org.mozilla.vrbrowser diff --git a/python/drivers/geckodriver-0.33.0/doc/Testing.md b/python/drivers/geckodriver-0.33.0/doc/Testing.md deleted file mode 100644 index 2f8f5c9..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Testing.md +++ /dev/null @@ -1,69 +0,0 @@ -# Testing geckodriver - -We verify and test geckodriver in a couple of different ways. -Since it is an implementation of the WebDriver web standard, we share -a set of conformance tests with other browser vendors through the -[Web Platform Tests] (WPT) initiative. This lets us ensure web -compatibility between _different_ WebDriver implementations for -different browsers. - -In addition to the WPT tests, geckodriver and webdriver have -unit tests. These are written in Rust, but you must explicitly -tell mach to build these by adding the following line to your [mozconfig]: - -```make -ac_add_options --enable-rust-tests -``` - -Tests can then be run by using the `test` sub command for [cargo] in the -specific source folder: - -```shell -% cd testing/geckodriver/src -% cargo test -``` - -To run the more extensive WPT tests you can use mach, but first -make sure you have built Firefox: - -```shell -% ./mach build -% ./mach wpt testing/web-platform/tests/webdriver -``` - -As these are functional integration tests and pop up Firefox windows -sporadically, a helpful tip is to suppress the window whilst you -are running them by using Firefox’ [headless mode]: - -```shell -% ./mach wpt --headless testing/web-platform/tests/webdriver -``` - -The `--headless` flag is equivalent to setting the `MOZ_HEADLESS` -output variable. In addition to `MOZ_HEADLESS` there is also -`MOZ_HEADLESS_WIDTH` and `MOZ_HEADLESS_HEIGHT` for controlling the -dimensions of the no-op virtual display. This is similar to using -Xvfb(1) which you may know from the X windowing system, but has -the additional benefit of also working on macOS and Windows. - -As you get in to development of geckodriver and Marionette you will -increasingly grow to understand our love for [trace-level logs]. -They provide us with the input—the HTTP requests—from the client -(in WPT’s case from the tests’ use of a custom WebDriver client), -the translation geckodriver makes to the [Marionette protocol], -the log output from Marionette, its responses back to geckodriver, -and finally the output—or the HTTP response—back to the client. - -The [trace-level logs] can be surfaced by passing on the `-vv` -flag to geckodriver through WPT: - -```shell -% ./mach wpt --webdriver-arg=-vv testing/web-platform/tests/webdriver -``` - -[Web Platform Tests]: http://web-platform-tests.org/ -[cargo]: http://doc.crates.io/guide.html -[headless mode]: https://developer.mozilla.org/en-US/Firefox/Headless_mode -[mozconfig]: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Configuring_Build_Options -[trace-level logs]: TraceLogs.md -[Marionette protocol]: /testing/marionette/Protocol.md diff --git a/python/drivers/geckodriver-0.33.0/doc/TraceLogs.md b/python/drivers/geckodriver-0.33.0/doc/TraceLogs.md deleted file mode 100644 index fb4e298..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/TraceLogs.md +++ /dev/null @@ -1,206 +0,0 @@ -# Enabling trace logs - -geckodriver provides different bands of logs for different audiences. -The most important log entries are shown to everyone by default, -and these include which port geckodriver provides the WebDriver -API on, as well as informative warnings, errors, and fatal exceptions. - -The different log bands are, in ascending bandwidth: - -1. `fatal` is reserved for exceptional circumstances when geckodriver - or Firefox cannot recover. This usually entails that either - one or both of the processes will exit. - -2. `error` messages are mistakes in the program code which it is - possible to recover from. - -3. `warn` shows warnings of more informative nature that are not - necessarily problems in geckodriver. This could for example happen - if you use the legacy `desiredCapabilities`/`requiredCapabilities` - objects instead of the new `alwaysMatch`/`firstMatch` structures. - -4. `info` (default) contains information about which port geckodriver - binds to, but also all messages from the lower-bandwidth levels - listed above. - -5. `config` additionally shows the negotiated capabilities after - matching the `alwaysMatch` capabilities with the sequence of - `firstMatch` capabilities. - -6. `debug` is reserved for information that is useful when programming. - -7. `trace`, where in addition to itself, all previous levels - are included. The trace level shows all HTTP requests received - by geckodriver, packets sent to and from the remote protocol in - Firefox, and responses sent back to your client. - -In other words this means that the configured level will coalesce -entries from all lower bands including itself. If you set the log -level to `error`, you will get log entries for both `fatal` and `error`. -Similarly for `trace`, you will get all the logs that are offered. - -To help debug a problem with geckodriver or Firefox, the trace-level -output is vital to understand what is going on. This is why we ask -that trace logs are included when filing bugs gainst geckodriver. -It is only under very special circumstances that a trace log is -not needed, so you will normally find that our first action when -triaging your issue will be to ask you to include one. Do yourself -and us a favour and provide a trace-level log right away. - -To silence geckodriver altogether you may for example either redirect -all output to append to some log files: - -```shell -% geckodriver >>geckodriver.log 2>>geckodriver.err.log -``` - -Or a black hole somewhere: - -```shell -% geckodriver >/dev/null 2>&1 -``` - -The log level set for geckodriver is propagated to the Marionette -logger in Firefox. Marionette is the remote protocol that geckodriver -uses to implement WebDriver. This means enabling trace logs for -geckodriver will also implicitly enable them for Marionette. - -The log level is set in different ways. Either by using the -`--log ` option, where `LEVEL` is one of the log levels -from the list above, or by using the `-v` (for debug) or `-vv` -(for trace) shorthands. For example, the following command will -enable trace logs for both geckodriver and Marionette: - -```shell -% geckodriver -vv -``` - -The second way of setting the log level is through capabilities. -geckodriver accepts a Mozilla-specific configuration object -in [`moz:firefoxOptions`]. This JSON Object, which is further -described in the [README] can hold Firefox-specific configuration, -such as which Firefox binary to use, additional preferences to set, -and of course which log level to use. - -[`moz:firefoxOptions`]: https://searchfox.org/mozilla-central/source/testing/geckodriver/README.md#firefox-capabilities -[README]: https://searchfox.org/mozilla-central/source/testing/geckodriver/README.md - -Each client has its own way of specifying capabilities, and some clients -include “helpers” for providing browser-specific configuration. -It is often advisable to use these helpers instead of encoding the -JSON Object yourself because it can be difficult to get the exact -details right, but if you choose to, it should look like this: - -```json -{"moz:firefoxOptions": {"log": {"level": "trace"}}} -``` - -Note that most known WebDriver clients, such as those provided by -the Selenium project, do not expose a way to actually _see_ the logs -unless you redirect the log output to a particular file (using the -method shown above) or let the client “inherit” geckodriver’s -output, for example by redirecting the stdout and stderr streams to -its own. The notable exceptions are the Python and Ruby bindings, -which surface geckodriver logs in a remarkable easy and efficient way. - -See the client-specific documentation below for the most idiomatic -way to enable trace logs in your language. We want to expand this -documentation to cover all the best known clients people use with -geckodriver. If you find your language missing, please consider -[submitting a patch]. - -[submitting a patch]: Patches.md - -## C-Sharp - -The Selenium [C# client] comes with a [`FirefoxOptions`] helper for -constructing the [`moz:firefoxOptions`] capabilities object: - -```csharp -FirefoxOptions options = new FirefoxOptions(); -options.LogLevel = FirefoxDriverLogLevel.Trace; -IWebDriver driver = new FirefoxDriver(options); -``` - -The log output is directed to stdout. - -[C# client]: https://seleniumhq.github.io/selenium/docs/api/dotnet/ -[`FirefoxOptions`]: https://seleniumhq.github.io/selenium/docs/api/dotnet/html/T_OpenQA_Selenium_Firefox_FirefoxOptions.htm - -## Java - -The Selenium [Java client] also comes with -a [`org.openqa.selenium.firefox.FirefoxOptions`] helper for -constructing the [`moz:firefoxOptions`] capabilities object: - -```java -FirefoxOptions options = new FirefoxOptions(); -options.setLogLevel(FirefoxDriverLogLevel.TRACE); -WebDriver driver = new FirefoxDriver(options); -``` - -The log output is directed to stdout. - -[Java client]: https://seleniumhq.github.io/selenium/docs/api/java/ -[`org.openqa.selenium.firefox.FirefoxOptions`]: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/firefox/FirefoxOptions.html - -## Javascript (webdriver.io) - -With the Selenium [JavaScript client] the capabilities object can directly be -constructed: - -```javascript -import WebDriver from 'webdriver' - -const driver = await WebDriver.newSession({ - capabilities: { - browserName: 'firefox', - 'moz:firefoxOptions': { - log: { level: 'trace' }, - } - } -}) -``` - -The log output is directed to stdout, or if geckodriver runs as a wdio plugin -then the generated logs are part of the wdio log system. - -[JavaScript client]: https://webdriver.io/ - -## Python - -The Selenium [Python client] comes with a -[`selenium.webdriver.firefox.options.Options`] helper that can -be used programmatically to construct the [`moz:firefoxOptions`] -capabilities object: - -```python -from selenium.webdriver import Firefox -from selenium.webdriver.firefox.options import Options - -opts = Options() -opts.log.level = "trace" -driver = Firefox(options=opts) -``` - -The log output is stored in a file called _geckodriver.log_ in your -script’s current working directory. - -[Python client]: https://selenium-python.readthedocs.io/ -[`selenium.webdriver.firefox.options.Options`]: https://github.com/SeleniumHQ/selenium/blob/master/py/selenium/webdriver/firefox/options.py - -## Ruby - -The Selenium [Ruby client] comes with an [`Options`] helper to -generate the correct [`moz:firefoxOptions`] capabilities object: - -```ruby -Selenium::WebDriver.logger.level = :debug -opts = Selenium::WebDriver::Firefox::Options.new(log_level: :trace) -driver = Selenium::WebDriver.for :firefox, options: opts -``` - -The log output is directed to stdout. - -[Ruby client]: https://seleniumhq.github.io/selenium/docs/api/rb/ -[`Options`]: https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/Firefox/Options.html diff --git a/python/drivers/geckodriver-0.33.0/doc/Usage.md b/python/drivers/geckodriver-0.33.0/doc/Usage.md deleted file mode 100644 index ee4ab86..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/Usage.md +++ /dev/null @@ -1,143 +0,0 @@ -# Usage - -geckodriver is an implementation of WebDriver, and WebDriver can -be used for widely different purposes. How you invoke geckodriver -largely depends on your use case. - -## Running Firefox in a container-based package - -When Firefox is packaged inside a container (e.g. [Snap], [Flatpak]), it may -see a different filesystem to the host. This can affect access to the generated -profile directory, which may result in a hang when starting Firefox. - -This is known to affect launching the default Firefox shipped with Ubuntu 22.04+. - -There are several workarounds available for this problem: - -- Do not use container-packaged Firefox builds with geckodriver. Instead -download a Firefox release from -and a geckodriver release from . - -- Use a geckodriver that runs in the same container filesystem as the Firefox -package. For example on Ubuntu `/snap/bin/geckodriver` will work with the -default Firefox. - -- Set the `--profile-root` command line option to write the profile to a -directory accessible to both Firefox and geckodriver, for example a non-hidden -directory under `$HOME`. - -[Flatpak]: https://flatpak.org/ -[Snap]: https://ubuntu.com/core/services/guide/snaps-intro - -## Selenium - -If you are using geckodriver through [Selenium], you must ensure that -you have version 3.11 or greater. Because geckodriver implements the -[W3C WebDriver standard][WebDriver] and not the same Selenium wire -protocol older drivers are using, you may experience incompatibilities -and migration problems when making the switch from FirefoxDriver to -geckodriver. - -Generally speaking, Selenium 3 enabled geckodriver as the default -WebDriver implementation for Firefox. With the release of Firefox 47, -FirefoxDriver had to be discontinued for its lack of support for the -[new multi-processing architecture in Gecko][e10s]. - -Selenium client bindings will pick up the _geckodriver_ binary executable -from your [system’s `PATH` environmental variable][PATH] unless you -override it by setting the `webdriver.gecko.driver` [Java VM system -property]: - -```java -System.setProperty("webdriver.gecko.driver", "/home/user/bin"); -``` - -Or by passing it as a flag to the [java(1)] launcher: - -```shell -% java -Dwebdriver.gecko.driver=/home/user/bin YourApplication -``` - -Your mileage with this approach may vary based on which programming -language bindings you are using. It is in any case generally the case -that geckodriver will be picked up if it is available on the system path. -In a bash compatible shell, you can make other programs aware of its -location by exporting or setting the `PATH` variable: - -```shell -% export PATH=$PATH:/home/user/bin -% whereis geckodriver -geckodriver: /home/user/bin/geckodriver -``` - -On Window systems you can change the system path by right-clicking **My -Computer** and choosing **Properties**. In the dialogue that appears, -navigate **Advanced** → **Environmental Variables** → **Path**. - -Or in the Windows console window: - -```shell -% set PATH=%PATH%;C:\bin\geckodriver -``` - -## Standalone - -Since geckodriver is a separate HTTP server that is a complete remote end -implementation of [WebDriver], it is possible to avoid using the Selenium -remote server if you have no requirements to distribute processes across -a matrix of systems. - -Given a W3C WebDriver conforming client library (or _local end_) you -may interact with the geckodriver HTTP server as if you were speaking -to any Selenium server. - -Using [curl(1)]: - -```shell -% geckodriver & -[1] 16010 -% 1491834109194 geckodriver INFO Listening on 127.0.0.1:4444 -% curl -H 'Content-Type: application/json' -d '{"capabilities": {"alwaysMatch": {"acceptInsecureCerts": true}}}' http://localhost:4444/session -{"value":{"sessionId":"d4605710-5a4e-4d64-a52a-778bb0c31e00","capabilities":{"acceptInsecureCerts":true,[...]}}} -% curl -H 'Content-Type: application/json' -d '{"url": "https://mozilla.org"}' http://localhost:4444/session/d4605710-5a4e-4d64-a52a-778bb0c31e00/url -{} -% curl http://localhost:4444/session/d4605710-5a4e-4d64-a52a-778bb0c31e00/url -{"value":"https://www.mozilla.org/en-US/" -% curl -X DELETE http://localhost:4444/session/d4605710-5a4e-4d64-a52a-778bb0c31e00 -{} -% fg -geckodriver -^C -``` - -Using the Python [wdclient] library: - -```python -import webdriver - -with webdriver.Session("127.0.0.1", 4444) as session: - session.url = "https://mozilla.org" - print "The current URL is %s" % session.url -``` - -And to run: - -```shell -% geckodriver & -[1] 16054 -% python example.py -1491835308354 geckodriver INFO Listening on 127.0.0.1:4444 -The current URL is https://www.mozilla.org/en-US/ -% fg -geckodriver -^C -``` - -[Selenium]: http://seleniumhq.org/ -[e10s]: https://developer.mozilla.org/en-US/Firefox/Multiprocess_Firefox -[PATH]: https://en.wikipedia.org/wiki/PATH_(variable) -[Java VM system property]: http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html -[java(1)]: http://www.manpagez.com/man/1/java/ -[WebDriver]: https://w3c.github.io/webdriver/ -[curl(1)]: http://www.manpagez.com/man/1/curl/ -[wdclient]: https://github.com/web-platform-tests/wpt/tree/master/tools/webdriver diff --git a/python/drivers/geckodriver-0.33.0/doc/index.rst b/python/drivers/geckodriver-0.33.0/doc/index.rst deleted file mode 100644 index 863c058..0000000 --- a/python/drivers/geckodriver-0.33.0/doc/index.rst +++ /dev/null @@ -1,55 +0,0 @@ -=========== -geckodriver -=========== - -Proxy for using W3C WebDriver-compatible clients to interact with -Gecko-based browsers. - -This program provides the HTTP API described by the `WebDriver protocol`_. -to communicate with Gecko browsers, such as Firefox. It translates calls -into the :ref:`Firefox remote protocol ` by acting as a proxy between the local- -and remote ends. - -You can consult the `change log`_ for a record of all notable changes -to the program. Releases_ are made available on GitHub. - -.. _WebDriver protocol: https://w3c.github.io/webdriver/#protocol -.. _change log: https://github.com/mozilla/geckodriver/releases -.. _Releases: https://github.com/mozilla/geckodriver/releases - - -.. toctree:: - :maxdepth: 1 - - Support.md - WebDriver capabilities - Capabilities.md - Usage.md - Flags.md - Profiles.md - Bugs.md - TraceLogs.md - CrashReports.md - Notarization.md - - -For developers -============== -.. toctree:: - :maxdepth: 1 - - Building.md - Testing.md - Patches.md - Releasing.md - ARM.md - - -Communication -============= - -The mailing list for geckodriver discussion is -https://groups.google.com/a/mozilla.org/g/dev-webdriver. - -If you prefer real-time chat, ask your questions -on `#webdriver:mozilla.org `__. diff --git a/python/drivers/geckodriver-0.33.0/marionette/Cargo.toml b/python/drivers/geckodriver-0.33.0/marionette/Cargo.toml deleted file mode 100644 index 2bcfaa3..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "marionette" -version = "0.4.0" -authors = ["Mozilla"] -description = "Library implementing the client side of Gecko's Marionette remote automation protocol." -edition = "2018" -keywords = ["mozilla", "firefox", "marionette", "webdriver"] -license = "MPL-2.0" -repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/geckodriver/marionette" - -[dependencies] -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -serde_repr = "0.1" diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/common.rs b/python/drivers/geckodriver-0.33.0/marionette/src/common.rs deleted file mode 100644 index e819757..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/common.rs +++ /dev/null @@ -1,240 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use serde::ser::SerializeMap; -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use serde_json::Value; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct BoolValue { - value: bool, -} - -impl BoolValue { - pub fn new(val: bool) -> Self { - BoolValue { value: val } - } -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Cookie { - pub name: String, - pub value: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub path: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub domain: Option, - #[serde(default)] - pub secure: bool, - #[serde(default, rename = "httpOnly")] - pub http_only: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub expiry: Option, - #[serde(skip_serializing_if = "Option::is_none", rename = "sameSite")] - pub same_site: Option, -} - -pub fn to_cookie(data: T, serializer: S) -> Result -where - S: Serializer, - T: Serialize, -{ - #[derive(Serialize)] - struct Wrapper { - cookie: T, - } - - Wrapper { cookie: data }.serialize(serializer) -} - -pub fn from_cookie<'de, D, T>(deserializer: D) -> Result -where - D: Deserializer<'de>, - T: serde::de::DeserializeOwned, - T: std::fmt::Debug, -{ - #[derive(Debug, Deserialize)] - struct Wrapper { - cookie: T, - } - - let w = Wrapper::deserialize(deserializer)?; - Ok(w.cookie) -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Date(pub u64); - -#[derive(Clone, Debug, PartialEq)] -pub enum Frame { - Index(u16), - Element(String), - Parent, -} - -impl Serialize for Frame { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut map = serializer.serialize_map(Some(1))?; - match self { - Frame::Index(nth) => map.serialize_entry("id", nth)?, - Frame::Element(el) => map.serialize_entry("element", el)?, - Frame::Parent => map.serialize_entry("id", &Value::Null)?, - } - map.end() - } -} - -impl<'de> Deserialize<'de> for Frame { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Debug, Deserialize)] - #[serde(rename_all = "lowercase")] - struct JsonFrame { - id: Option, - element: Option, - } - - let json = JsonFrame::deserialize(deserializer)?; - match (json.id, json.element) { - (Some(_id), Some(_element)) => Err(de::Error::custom("conflicting frame identifiers")), - (Some(id), None) => Ok(Frame::Index(id)), - (None, Some(element)) => Ok(Frame::Element(element)), - (None, None) => Ok(Frame::Parent), - } - } -} - -// TODO(nupur): Bug 1567165 - Make WebElement in Marionette a unit struct -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct WebElement { - #[serde(rename = "element-6066-11e4-a52e-4f735466cecf")] - pub element: String, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Timeouts { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub implicit: Option, - #[serde(default, rename = "pageLoad", skip_serializing_if = "Option::is_none")] - pub page_load: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[allow(clippy::option_option)] - pub script: Option>, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Window { - pub handle: String, -} - -pub fn to_name(data: T, serializer: S) -> Result -where - S: Serializer, - T: Serialize, -{ - #[derive(Serialize)] - struct Wrapper { - name: T, - } - - Wrapper { name: data }.serialize(serializer) -} - -pub fn from_name<'de, D, T>(deserializer: D) -> Result -where - D: Deserializer<'de>, - T: serde::de::DeserializeOwned, - T: std::fmt::Debug, -{ - #[derive(Debug, Deserialize)] - struct Wrapper { - name: T, - } - - let w = Wrapper::deserialize(deserializer)?; - Ok(w.name) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test::{assert_de, assert_ser, assert_ser_de, ELEMENT_KEY}; - use serde_json::json; - - #[test] - fn test_cookie_default_values() { - let data = Cookie { - name: "hello".into(), - value: "world".into(), - path: None, - domain: None, - secure: false, - http_only: false, - expiry: None, - same_site: None, - }; - assert_de(&data, json!({"name":"hello", "value":"world"})); - } - - #[test] - fn test_json_frame_index() { - assert_ser_de(&Frame::Index(1234), json!({"id": 1234})); - } - - #[test] - fn test_json_frame_element() { - assert_ser_de(&Frame::Element("elem".into()), json!({"element": "elem"})); - } - - #[test] - fn test_json_frame_parent() { - assert_ser_de(&Frame::Parent, json!({ "id": null })); - } - - #[test] - fn test_web_element() { - let data = WebElement { - element: "foo".into(), - }; - assert_ser_de(&data, json!({ELEMENT_KEY: "foo"})); - } - - #[test] - fn test_timeouts_with_all_params() { - let data = Timeouts { - implicit: Some(1000), - page_load: Some(200000), - script: Some(Some(60000)), - }; - assert_ser_de( - &data, - json!({"implicit":1000,"pageLoad":200000,"script":60000}), - ); - } - - #[test] - fn test_timeouts_with_missing_params() { - let data = Timeouts { - implicit: Some(1000), - page_load: None, - script: None, - }; - assert_ser_de(&data, json!({"implicit":1000})); - } - - #[test] - fn test_timeouts_setting_script_none() { - let data = Timeouts { - implicit: Some(1000), - page_load: None, - script: Some(None), - }; - assert_ser(&data, json!({"implicit":1000, "script":null})); - } -} diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/error.rs b/python/drivers/geckodriver-0.33.0/marionette/src/error.rs deleted file mode 100644 index 6b05410..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/error.rs +++ /dev/null @@ -1,184 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use std::error; -use std::fmt; - -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)] -#[serde(untagged)] -pub(crate) enum Error { - Marionette(MarionetteError), -} - -impl Error { - pub fn kind(&self) -> ErrorKind { - match *self { - Error::Marionette(ref err) => err.kind, - } - } -} - -impl fmt::Debug for Error { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - match self { - Error::Marionette(ref err) => fmt - .debug_struct("Marionette") - .field("kind", &err.kind) - .field("message", &err.message) - .field("stacktrace", &err.stack.clone()) - .finish(), - } - } -} - -impl fmt::Display for Error { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - match self { - Error::Marionette(ref err) => write!(fmt, "{}: {}", err.kind, err.message), - } - } -} - -impl error::Error for Error { - fn description(&self) -> &str { - match self { - Error::Marionette(_) => self.kind().as_str(), - } - } -} - -#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)] -pub struct MarionetteError { - #[serde(rename = "error")] - pub kind: ErrorKind, - #[serde(default = "empty_string")] - pub message: String, - #[serde(rename = "stacktrace", default = "empty_string")] - pub stack: String, -} - -fn empty_string() -> String { - "".to_owned() -} - -impl From for Error { - fn from(error: MarionetteError) -> Error { - Error::Marionette(error) - } -} - -#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)] -pub enum ErrorKind { - #[serde(rename = "element click intercepted")] - ElementClickIntercepted, - #[serde(rename = "element not accessible")] - ElementNotAccessible, - #[serde(rename = "element not interactable")] - ElementNotInteractable, - #[serde(rename = "insecure certificate")] - InsecureCertificate, - #[serde(rename = "invalid argument")] - InvalidArgument, - #[serde(rename = "invalid cookie")] - InvalidCookieDomain, - #[serde(rename = "invalid element state")] - InvalidElementState, - #[serde(rename = "invalid selector")] - InvalidSelector, - #[serde(rename = "invalid session id")] - InvalidSessionId, - #[serde(rename = "javascript error")] - JavaScript, - #[serde(rename = "move target out of bounds")] - MoveTargetOutOfBounds, - #[serde(rename = "no such alert")] - NoSuchAlert, - #[serde(rename = "no such element")] - NoSuchElement, - #[serde(rename = "no such frame")] - NoSuchFrame, - #[serde(rename = "no such window")] - NoSuchWindow, - #[serde(rename = "script timeout")] - ScriptTimeout, - #[serde(rename = "session not created")] - SessionNotCreated, - #[serde(rename = "stale element reference")] - StaleElementReference, - #[serde(rename = "timeout")] - Timeout, - #[serde(rename = "unable to set cookie")] - UnableToSetCookie, - #[serde(rename = "unexpected alert open")] - UnexpectedAlertOpen, - #[serde(rename = "unknown command")] - UnknownCommand, - #[serde(rename = "unknown error")] - Unknown, - #[serde(rename = "unsupported operation")] - UnsupportedOperation, - #[serde(rename = "webdriver error")] - WebDriver, -} - -impl ErrorKind { - pub(crate) fn as_str(self) -> &'static str { - use ErrorKind::*; - match self { - ElementClickIntercepted => "element click intercepted", - ElementNotAccessible => "element not accessible", - ElementNotInteractable => "element not interactable", - InsecureCertificate => "insecure certificate", - InvalidArgument => "invalid argument", - InvalidCookieDomain => "invalid cookie", - InvalidElementState => "invalid element state", - InvalidSelector => "invalid selector", - InvalidSessionId => "invalid session id", - JavaScript => "javascript error", - MoveTargetOutOfBounds => "move target out of bounds", - NoSuchAlert => "no such alert", - NoSuchElement => "no such element", - NoSuchFrame => "no such frame", - NoSuchWindow => "no such window", - ScriptTimeout => "script timeout", - SessionNotCreated => "session not created", - StaleElementReference => "stale eelement referencee", - Timeout => "timeout", - UnableToSetCookie => "unable to set cookie", - UnexpectedAlertOpen => "unexpected alert open", - UnknownCommand => "unknown command", - Unknown => "unknown error", - UnsupportedOperation => "unsupported operation", - WebDriver => "webdriver error", - } - } -} - -impl fmt::Display for ErrorKind { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - write!(fmt, "{}", self.as_str()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test::assert_ser_de; - use serde_json::json; - - #[test] - fn test_json_error() { - let err = MarionetteError { - kind: ErrorKind::Timeout, - message: "".into(), - stack: "".into(), - }; - assert_ser_de( - &err, - json!({"error": "timeout", "message": "", "stacktrace": ""}), - ); - } -} diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/lib.rs b/python/drivers/geckodriver-0.33.0/marionette/src/lib.rs deleted file mode 100644 index 80817c5..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/lib.rs +++ /dev/null @@ -1,14 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -pub mod error; - -pub mod common; -pub mod marionette; -pub mod message; -pub mod result; -pub mod webdriver; - -#[cfg(test)] -mod test; diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/marionette.rs b/python/drivers/geckodriver-0.33.0/marionette/src/marionette.rs deleted file mode 100644 index c06e2d6..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/marionette.rs +++ /dev/null @@ -1,69 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use serde::{Deserialize, Serialize}; - -use crate::common::BoolValue; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[allow(non_camel_case_types)] -pub enum AppStatus { - eAttemptQuit, - eConsiderQuit, - eForceQuit, - eRestart, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub enum Command { - #[serde(rename = "Marionette:AcceptConnections")] - AcceptConnections(BoolValue), - #[serde(rename = "Marionette:Quit")] - DeleteSession { flags: Vec }, - #[serde(rename = "Marionette:GetContext")] - GetContext, - #[serde(rename = "Marionette:GetScreenOrientation")] - GetScreenOrientation, -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test::assert_ser_de; - use serde_json::json; - - #[test] - fn test_json_command_accept_connections() { - assert_ser_de( - &Command::AcceptConnections(BoolValue::new(false)), - json!({"Marionette:AcceptConnections": {"value": false }}), - ); - } - - #[test] - fn test_json_command_delete_session() { - let data = &Command::DeleteSession { - flags: vec![AppStatus::eForceQuit], - }; - assert_ser_de(data, json!({"Marionette:Quit": {"flags": ["eForceQuit"]}})); - } - - #[test] - fn test_json_command_get_context() { - assert_ser_de(&Command::GetContext, json!("Marionette:GetContext")); - } - - #[test] - fn test_json_command_get_screen_orientation() { - assert_ser_de( - &Command::GetScreenOrientation, - json!("Marionette:GetScreenOrientation"), - ); - } - - #[test] - fn test_json_command_invalid() { - assert!(serde_json::from_value::(json!("foo")).is_err()); - } -} diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/message.rs b/python/drivers/geckodriver-0.33.0/marionette/src/message.rs deleted file mode 100644 index 704d52f..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/message.rs +++ /dev/null @@ -1,336 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use serde::de::{self, SeqAccess, Unexpected, Visitor}; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use serde_json::{Map, Value}; -use serde_repr::{Deserialize_repr, Serialize_repr}; -use std::fmt; - -use crate::error::MarionetteError; -use crate::marionette; -use crate::result::MarionetteResult; -use crate::webdriver; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(untagged)] -pub enum Command { - WebDriver(webdriver::Command), - Marionette(marionette::Command), -} - -impl Command { - pub fn name(&self) -> String { - let (command_name, _) = self.first_entry(); - command_name - } - - fn params(&self) -> Value { - let (_, params) = self.first_entry(); - params - } - - fn first_entry(&self) -> (String, serde_json::Value) { - match serde_json::to_value(self).unwrap() { - Value::String(cmd) => (cmd, Value::Object(Map::new())), - Value::Object(items) => { - let mut iter = items.iter(); - let (cmd, params) = iter.next().unwrap(); - (cmd.to_string(), params.clone()) - } - _ => unreachable!(), - } - } -} - -#[derive(Clone, Debug, PartialEq, Serialize_repr, Deserialize_repr)] -#[repr(u8)] -enum MessageDirection { - Incoming = 0, - Outgoing = 1, -} - -pub type MessageId = u32; - -#[derive(Debug, Clone, PartialEq)] -pub struct Request(pub MessageId, pub Command); - -impl Request { - pub fn id(&self) -> MessageId { - self.0 - } - - pub fn command(&self) -> &Command { - &self.1 - } - - pub fn params(&self) -> Value { - self.command().params() - } -} - -impl Serialize for Request { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - ( - MessageDirection::Incoming, - self.id(), - self.command().name(), - self.params(), - ) - .serialize(serializer) - } -} - -#[derive(Debug, PartialEq)] -pub enum Response { - Result { - id: MessageId, - result: MarionetteResult, - }, - Error { - id: MessageId, - error: MarionetteError, - }, -} - -impl Serialize for Response { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match self { - Response::Result { id, result } => { - (MessageDirection::Outgoing, id, Value::Null, &result).serialize(serializer) - } - Response::Error { id, error } => { - (MessageDirection::Outgoing, id, &error, Value::Null).serialize(serializer) - } - } - } -} - -#[derive(Debug, PartialEq, Serialize)] -#[serde(untagged)] -pub enum Message { - Incoming(Request), - Outgoing(Response), -} - -struct MessageVisitor; - -impl<'de> Visitor<'de> for MessageVisitor { - type Value = Message; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("four-element array") - } - - fn visit_seq>(self, mut seq: A) -> Result { - let direction = seq - .next_element::()? - .ok_or_else(|| de::Error::invalid_length(0, &self))?; - let id: MessageId = seq - .next_element()? - .ok_or_else(|| de::Error::invalid_length(1, &self))?; - - let msg = match direction { - MessageDirection::Incoming => { - let name: String = seq - .next_element()? - .ok_or_else(|| de::Error::invalid_length(2, &self))?; - let params: Value = seq - .next_element()? - .ok_or_else(|| de::Error::invalid_length(3, &self))?; - - let command = match params { - Value::Object(ref items) if !items.is_empty() => { - let command_to_params = { - let mut m = Map::new(); - m.insert(name, params); - Value::Object(m) - }; - serde_json::from_value(command_to_params).map_err(de::Error::custom) - } - Value::Object(_) | Value::Null => { - serde_json::from_value(Value::String(name)).map_err(de::Error::custom) - } - x => Err(de::Error::custom(format!("unknown params type: {}", x))), - }?; - Message::Incoming(Request(id, command)) - } - - MessageDirection::Outgoing => { - let maybe_error: Option = seq - .next_element()? - .ok_or_else(|| de::Error::invalid_length(2, &self))?; - - let response = if let Some(error) = maybe_error { - seq.next_element::()? - .ok_or_else(|| de::Error::invalid_length(3, &self))? - .as_null() - .ok_or_else(|| de::Error::invalid_type(Unexpected::Unit, &self))?; - Response::Error { id, error } - } else { - let result: MarionetteResult = seq - .next_element()? - .ok_or_else(|| de::Error::invalid_length(3, &self))?; - Response::Result { id, result } - }; - - Message::Outgoing(response) - } - }; - - Ok(msg) - } -} - -impl<'de> Deserialize<'de> for Message { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - deserializer.deserialize_seq(MessageVisitor) - } -} - -#[cfg(test)] -mod tests { - use serde_json::json; - - use super::*; - - use crate::common::*; - use crate::error::{ErrorKind, MarionetteError}; - use crate::test::assert_ser_de; - - #[test] - fn test_incoming() { - let json = - json!([0, 42, "WebDriver:FindElement", {"using": "css selector", "value": "value"}]); - let find_element = webdriver::Command::FindElement(webdriver::Locator { - using: webdriver::Selector::Css, - value: "value".into(), - }); - let req = Request(42, Command::WebDriver(find_element)); - let msg = Message::Incoming(req); - assert_ser_de(&msg, json); - } - - #[test] - fn test_incoming_empty_params() { - let json = json!([0, 42, "WebDriver:GetTimeouts", {}]); - let req = Request(42, Command::WebDriver(webdriver::Command::GetTimeouts)); - let msg = Message::Incoming(req); - assert_ser_de(&msg, json); - } - - #[test] - fn test_incoming_common_params() { - let json = json!([0, 42, "Marionette:AcceptConnections", {"value": false}]); - let params = BoolValue::new(false); - let req = Request( - 42, - Command::Marionette(marionette::Command::AcceptConnections(params)), - ); - let msg = Message::Incoming(req); - assert_ser_de(&msg, json); - } - - #[test] - fn test_incoming_params_derived() { - assert!(serde_json::from_value::( - json!([0,42,"WebDriver:FindElement",{"using":"foo","value":"foo"}]) - ) - .is_err()); - assert!(serde_json::from_value::( - json!([0,42,"Marionette:AcceptConnections",{"value":"foo"}]) - ) - .is_err()); - } - - #[test] - fn test_incoming_no_params() { - assert!(serde_json::from_value::( - json!([0,42,"WebDriver:GetTimeouts",{"value":true}]) - ) - .is_err()); - assert!(serde_json::from_value::( - json!([0,42,"Marionette:Context",{"value":"foo"}]) - ) - .is_err()); - assert!(serde_json::from_value::( - json!([0,42,"Marionette:GetScreenOrientation",{"value":true}]) - ) - .is_err()); - } - - #[test] - fn test_outgoing_result() { - let json = json!([1, 42, null, { "value": null }]); - let result = MarionetteResult::Null; - let msg = Message::Outgoing(Response::Result { id: 42, result }); - - assert_ser_de(&msg, json); - } - - #[test] - fn test_outgoing_error() { - let json = - json!([1, 42, {"error": "no such element", "message": "", "stacktrace": ""}, null]); - let error = MarionetteError { - kind: ErrorKind::NoSuchElement, - message: "".into(), - stack: "".into(), - }; - let msg = Message::Outgoing(Response::Error { id: 42, error }); - - assert_ser_de(&msg, json); - } - - #[test] - fn test_invalid_type() { - assert!( - serde_json::from_value::(json!([2, 42, "WebDriver:GetTimeouts", {}])).is_err() - ); - assert!(serde_json::from_value::(json!([3, 42, "no such element", {}])).is_err()); - } - - #[test] - fn test_missing_fields() { - // all fields are required - assert!( - serde_json::from_value::(json!([2, 42, "WebDriver:GetTimeouts"])).is_err() - ); - assert!(serde_json::from_value::(json!([2, 42])).is_err()); - assert!(serde_json::from_value::(json!([2])).is_err()); - assert!(serde_json::from_value::(json!([])).is_err()); - } - - #[test] - fn test_unknown_command() { - assert!(serde_json::from_value::(json!([0, 42, "hooba", {}])).is_err()); - } - - #[test] - fn test_unknown_error() { - assert!(serde_json::from_value::(json!([1, 42, "flooba", {}])).is_err()); - } - - #[test] - fn test_message_id_bounds() { - let overflow = i64::from(std::u32::MAX) + 1; - let underflow = -1; - - fn get_timeouts(message_id: i64) -> Value { - json!([0, message_id, "WebDriver:GetTimeouts", {}]) - } - - assert!(serde_json::from_value::(get_timeouts(overflow)).is_err()); - assert!(serde_json::from_value::(get_timeouts(underflow)).is_err()); - } -} diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/result.rs b/python/drivers/geckodriver-0.33.0/marionette/src/result.rs deleted file mode 100644 index 95817c1..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/result.rs +++ /dev/null @@ -1,223 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use serde::de; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use serde_json::Value; - -use crate::common::{Cookie, Timeouts, WebElement}; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct NewWindow { - handle: String, - #[serde(rename = "type")] - type_hint: String, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct WindowRect { - pub x: i32, - pub y: i32, - pub width: i32, - pub height: i32, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct ElementRect { - pub x: f64, - pub y: f64, - pub width: f64, - pub height: f64, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(untagged)] -pub enum MarionetteResult { - #[serde(deserialize_with = "from_value", serialize_with = "to_value")] - Bool(bool), - #[serde(deserialize_with = "from_value", serialize_with = "to_empty_value")] - Null, - NewWindow(NewWindow), - WindowRect(WindowRect), - ElementRect(ElementRect), - #[serde(deserialize_with = "from_value", serialize_with = "to_value")] - String(String), - Strings(Vec), - #[serde(deserialize_with = "from_value", serialize_with = "to_value")] - WebElement(WebElement), - WebElements(Vec), - Cookies(Vec), - Timeouts(Timeouts), -} - -fn to_value(data: T, serializer: S) -> Result -where - S: Serializer, - T: Serialize, -{ - #[derive(Serialize)] - struct Wrapper { - value: T, - } - - Wrapper { value: data }.serialize(serializer) -} - -fn to_empty_value(serializer: S) -> Result -where - S: Serializer, -{ - #[derive(Serialize)] - struct Wrapper { - value: Value, - } - - Wrapper { value: Value::Null }.serialize(serializer) -} - -fn from_value<'de, D, T>(deserializer: D) -> Result -where - D: Deserializer<'de>, - T: serde::de::DeserializeOwned, - T: std::fmt::Debug, -{ - #[derive(Debug, Deserialize)] - struct Wrapper { - value: T, - } - - let v = Value::deserialize(deserializer)?; - if v.is_object() { - let w = serde_json::from_value::>(v).map_err(de::Error::custom)?; - Ok(w.value) - } else { - Err(de::Error::custom("Cannot be deserialized to struct")) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test::{assert_de, assert_ser_de, ELEMENT_KEY}; - use serde_json::json; - - #[test] - fn test_boolean_response() { - assert_ser_de(&MarionetteResult::Bool(true), json!({"value": true})); - } - - #[test] - fn test_cookies_response() { - let mut data = Vec::new(); - data.push(Cookie { - name: "foo".into(), - value: "bar".into(), - path: Some("/common".into()), - domain: Some("web-platform.test".into()), - secure: false, - http_only: false, - expiry: None, - same_site: Some("Strict".into()), - }); - assert_ser_de( - &MarionetteResult::Cookies(data), - json!([{"name":"foo","value":"bar","path":"/common","domain":"web-platform.test","secure":false,"httpOnly":false,"sameSite":"Strict"}]), - ); - } - - #[test] - fn test_new_window_response() { - let data = NewWindow { - handle: "6442450945".into(), - type_hint: "tab".into(), - }; - let json = json!({"handle": "6442450945", "type": "tab"}); - assert_ser_de(&MarionetteResult::NewWindow(data), json); - } - - #[test] - fn test_web_element_response() { - let data = WebElement { - element: "foo".into(), - }; - assert_ser_de( - &MarionetteResult::WebElement(data), - json!({"value": {ELEMENT_KEY: "foo"}}), - ); - } - - #[test] - fn test_web_elements_response() { - let data = vec![ - WebElement { - element: "foo".into(), - }, - WebElement { - element: "bar".into(), - }, - ]; - assert_ser_de( - &MarionetteResult::WebElements(data), - json!([{ELEMENT_KEY: "foo"}, {ELEMENT_KEY: "bar"}]), - ); - } - - #[test] - fn test_timeouts_response() { - let data = Timeouts { - implicit: Some(1000), - page_load: Some(200000), - script: Some(Some(60000)), - }; - assert_ser_de( - &MarionetteResult::Timeouts(data), - json!({"implicit":1000,"pageLoad":200000,"script":60000}), - ); - } - - #[test] - fn test_string_response() { - assert_ser_de( - &MarionetteResult::String("foo".into()), - json!({"value": "foo"}), - ); - } - - #[test] - fn test_strings_response() { - assert_ser_de( - &MarionetteResult::Strings(vec!["2147483649".to_string()]), - json!(["2147483649"]), - ); - } - - #[test] - fn test_null_response() { - assert_ser_de(&MarionetteResult::Null, json!({ "value": null })); - } - - #[test] - fn test_window_rect_response() { - let data = WindowRect { - x: 100, - y: 100, - width: 800, - height: 600, - }; - let json = json!({"x": 100, "y": 100, "width": 800, "height": 600}); - assert_ser_de(&MarionetteResult::WindowRect(data), json); - } - - #[test] - fn test_element_rect_response() { - let data = ElementRect { - x: 8.0, - y: 8.0, - width: 148.6666717529297, - height: 22.0, - }; - let json = json!({"x": 8, "y": 8, "width": 148.6666717529297, "height": 22}); - assert_de(&MarionetteResult::ElementRect(data), json); - } -} diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/test.rs b/python/drivers/geckodriver-0.33.0/marionette/src/test.rs deleted file mode 100644 index 3b20bb0..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/test.rs +++ /dev/null @@ -1,35 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -pub static ELEMENT_KEY: &'static str = "element-6066-11e4-a52e-4f735466cecf"; - -pub fn assert_ser_de(data: &T, json: serde_json::Value) -where - T: std::fmt::Debug, - T: std::cmp::PartialEq, - T: serde::de::DeserializeOwned, - T: serde::Serialize, -{ - assert_eq!(serde_json::to_value(data).unwrap(), json); - assert_eq!(data, &serde_json::from_value::(json).unwrap()); -} - -#[allow(dead_code)] -pub fn assert_ser(data: &T, json: serde_json::Value) -where - T: std::fmt::Debug, - T: std::cmp::PartialEq, - T: serde::Serialize, -{ - assert_eq!(serde_json::to_value(data).unwrap(), json); -} - -pub fn assert_de(data: &T, json: serde_json::Value) -where - T: std::fmt::Debug, - T: std::cmp::PartialEq, - T: serde::de::DeserializeOwned, -{ - assert_eq!(data, &serde_json::from_value::(json).unwrap()); -} diff --git a/python/drivers/geckodriver-0.33.0/marionette/src/webdriver.rs b/python/drivers/geckodriver-0.33.0/marionette/src/webdriver.rs deleted file mode 100644 index fa1a489..0000000 --- a/python/drivers/geckodriver-0.33.0/marionette/src/webdriver.rs +++ /dev/null @@ -1,512 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use serde::{Deserialize, Serialize}; -use serde_json::Value; - -use crate::common::{from_cookie, from_name, to_cookie, to_name, Cookie, Frame, Timeouts, Window}; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Url { - pub url: String, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Locator { - pub using: Selector, - pub value: String, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub enum Selector { - #[serde(rename = "css selector")] - Css, - #[serde(rename = "link text")] - LinkText, - #[serde(rename = "partial link text")] - PartialLinkText, - #[serde(rename = "tag name")] - TagName, - #[serde(rename = "xpath")] - XPath, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct NewWindow { - #[serde(rename = "type", skip_serializing_if = "Option::is_none")] - pub type_hint: Option, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct WindowRect { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub x: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub y: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub width: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub height: Option, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Keys { - pub text: String, - pub value: Vec, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(default, rename_all = "camelCase")] -pub struct PrintParameters { - pub orientation: PrintOrientation, - pub scale: f64, - pub background: bool, - pub page: PrintPage, - pub margin: PrintMargins, - pub page_ranges: Vec, - pub shrink_to_fit: bool, -} - -impl Default for PrintParameters { - fn default() -> Self { - PrintParameters { - orientation: PrintOrientation::default(), - scale: 1.0, - background: false, - page: PrintPage::default(), - margin: PrintMargins::default(), - page_ranges: Vec::new(), - shrink_to_fit: true, - } - } -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum PrintOrientation { - Landscape, - Portrait, -} - -impl Default for PrintOrientation { - fn default() -> Self { - PrintOrientation::Portrait - } -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct PrintPage { - pub width: f64, - pub height: f64, -} - -impl Default for PrintPage { - fn default() -> Self { - PrintPage { - width: 21.59, - height: 27.94, - } - } -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct PrintMargins { - pub top: f64, - pub bottom: f64, - pub left: f64, - pub right: f64, -} - -impl Default for PrintMargins { - fn default() -> Self { - PrintMargins { - top: 1.0, - bottom: 1.0, - left: 1.0, - right: 1.0, - } - } -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct ScreenshotOptions { - pub id: Option, - pub highlights: Vec>, - pub full: bool, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct Script { - pub script: String, - pub args: Option>, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub enum Command { - #[serde(rename = "WebDriver:AcceptAlert")] - AcceptAlert, - #[serde( - rename = "WebDriver:AddCookie", - serialize_with = "to_cookie", - deserialize_with = "from_cookie" - )] - AddCookie(Cookie), - #[serde(rename = "WebDriver:CloseWindow")] - CloseWindow, - #[serde( - rename = "WebDriver:DeleteCookie", - serialize_with = "to_name", - deserialize_with = "from_name" - )] - DeleteCookie(String), - #[serde(rename = "WebDriver:DeleteAllCookies")] - DeleteCookies, - #[serde(rename = "WebDriver:DeleteSession")] - DeleteSession, - #[serde(rename = "WebDriver:DismissAlert")] - DismissAlert, - #[serde(rename = "WebDriver:ElementClear")] - ElementClear { id: String }, - #[serde(rename = "WebDriver:ElementClick")] - ElementClick { id: String }, - #[serde(rename = "WebDriver:ElementSendKeys")] - ElementSendKeys { - id: String, - text: String, - value: Vec, - }, - #[serde(rename = "WebDriver:ExecuteAsyncScript")] - ExecuteAsyncScript(Script), - #[serde(rename = "WebDriver:ExecuteScript")] - ExecuteScript(Script), - #[serde(rename = "WebDriver:FindElement")] - FindElement(Locator), - #[serde(rename = "WebDriver:FindElements")] - FindElements(Locator), - #[serde(rename = "WebDriver:FindElement")] - FindElementElement { - element: String, - using: Selector, - value: String, - }, - #[serde(rename = "WebDriver:FindElements")] - FindElementElements { - element: String, - using: Selector, - value: String, - }, - #[serde(rename = "WebDriver:FindElementFromShadowRoot")] - FindShadowRootElement { - #[serde(rename = "shadowRoot")] - shadow_root: String, - using: Selector, - value: String, - }, - #[serde(rename = "WebDriver:FindElementsFromShadowRoot")] - FindShadowRootElements { - #[serde(rename = "shadowRoot")] - shadow_root: String, - using: Selector, - value: String, - }, - #[serde(rename = "WebDriver:FullscreenWindow")] - FullscreenWindow, - #[serde(rename = "WebDriver:Navigate")] - Get(Url), - #[serde(rename = "WebDriver:GetActiveElement")] - GetActiveElement, - #[serde(rename = "WebDriver:GetAlertText")] - GetAlertText, - #[serde(rename = "WebDriver:GetComputedLabel")] - GetComputedLabel { id: String }, - #[serde(rename = "WebDriver:GetComputedRole")] - GetComputedRole { id: String }, - #[serde(rename = "WebDriver:GetCookies")] - GetCookies, - #[serde(rename = "WebDriver:GetElementCSSValue")] - GetCSSValue { - id: String, - #[serde(rename = "propertyName")] - property: String, - }, - #[serde(rename = "WebDriver:GetCurrentURL")] - GetCurrentUrl, - #[serde(rename = "WebDriver:GetElementAttribute")] - GetElementAttribute { id: String, name: String }, - #[serde(rename = "WebDriver:GetElementProperty")] - GetElementProperty { id: String, name: String }, - #[serde(rename = "WebDriver:GetElementRect")] - GetElementRect { id: String }, - #[serde(rename = "WebDriver:GetElementTagName")] - GetElementTagName { id: String }, - #[serde(rename = "WebDriver:GetElementText")] - GetElementText { id: String }, - #[serde(rename = "WebDriver:GetPageSource")] - GetPageSource, - #[serde(rename = "WebDriver:GetShadowRoot")] - GetShadowRoot { id: String }, - #[serde(rename = "WebDriver:GetTimeouts")] - GetTimeouts, - #[serde(rename = "WebDriver:GetTitle")] - GetTitle, - #[serde(rename = "WebDriver:GetWindowHandle")] - GetWindowHandle, - #[serde(rename = "WebDriver:GetWindowHandles")] - GetWindowHandles, - #[serde(rename = "WebDriver:GetWindowRect")] - GetWindowRect, - #[serde(rename = "WebDriver:Back")] - GoBack, - #[serde(rename = "WebDriver:Forward")] - GoForward, - #[serde(rename = "WebDriver:IsElementDisplayed")] - IsDisplayed { id: String }, - #[serde(rename = "WebDriver:IsElementEnabled")] - IsEnabled { id: String }, - #[serde(rename = "WebDriver:IsElementSelected")] - IsSelected { id: String }, - #[serde(rename = "WebDriver:MaximizeWindow")] - MaximizeWindow, - #[serde(rename = "WebDriver:MinimizeWindow")] - MinimizeWindow, - #[serde(rename = "WebDriver:NewWindow")] - NewWindow(NewWindow), - #[serde(rename = "WebDriver:Print")] - Print(PrintParameters), - #[serde(rename = "WebDriver:Refresh")] - Refresh, - #[serde(rename = "WebDriver:ReleaseActions")] - ReleaseActions, - #[serde(rename = "WebDriver:SendAlertText")] - SendAlertText(Keys), - #[serde(rename = "WebDriver:SetTimeouts")] - SetTimeouts(Timeouts), - #[serde(rename = "WebDriver:SetWindowRect")] - SetWindowRect(WindowRect), - #[serde(rename = "WebDriver:SwitchToFrame")] - SwitchToFrame(Frame), - #[serde(rename = "WebDriver:SwitchToParentFrame")] - SwitchToParentFrame, - #[serde(rename = "WebDriver:SwitchToWindow")] - SwitchToWindow(Window), - #[serde(rename = "WebDriver:TakeScreenshot")] - TakeElementScreenshot(ScreenshotOptions), - #[serde(rename = "WebDriver:TakeScreenshot")] - TakeFullScreenshot(ScreenshotOptions), - #[serde(rename = "WebDriver:TakeScreenshot")] - TakeScreenshot(ScreenshotOptions), -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::common::Date; - use crate::test::{assert_ser, assert_ser_de}; - use serde_json::json; - - #[test] - fn test_json_screenshot() { - let data = ScreenshotOptions { - id: None, - highlights: vec![], - full: false, - }; - let json = json!({"full":false,"highlights":[],"id":null}); - assert_ser_de(&data, json); - } - - #[test] - fn test_json_selector_css() { - assert_ser_de(&Selector::Css, json!("css selector")); - } - - #[test] - fn test_json_selector_link_text() { - assert_ser_de(&Selector::LinkText, json!("link text")); - } - - #[test] - fn test_json_selector_partial_link_text() { - assert_ser_de(&Selector::PartialLinkText, json!("partial link text")); - } - - #[test] - fn test_json_selector_tag_name() { - assert_ser_de(&Selector::TagName, json!("tag name")); - } - - #[test] - fn test_json_selector_xpath() { - assert_ser_de(&Selector::XPath, json!("xpath")); - } - - #[test] - fn test_json_selector_invalid() { - assert!(serde_json::from_value::(json!("foo")).is_err()); - } - - #[test] - fn test_json_locator() { - let json = json!({ - "using": "partial link text", - "value": "link text", - }); - let data = Locator { - using: Selector::PartialLinkText, - value: "link text".into(), - }; - - assert_ser_de(&data, json); - } - - #[test] - fn test_json_keys() { - let data = Keys { - text: "Foo".into(), - value: vec!["F".into(), "o".into(), "o".into()], - }; - let json = json!({"text": "Foo", "value": ["F", "o", "o"]}); - assert_ser_de(&data, json); - } - - #[test] - fn test_json_new_window() { - let data = NewWindow { - type_hint: Some("foo".into()), - }; - assert_ser_de(&data, json!({ "type": "foo" })); - } - - #[test] - fn test_json_window_rect() { - let data = WindowRect { - x: Some(123), - y: None, - width: None, - height: None, - }; - assert_ser_de(&data, json!({"x": 123})); - } - - #[test] - fn test_command_with_params() { - let locator = Locator { - using: Selector::Css, - value: "value".into(), - }; - let json = json!({"WebDriver:FindElement": {"using": "css selector", "value": "value"}}); - assert_ser_de(&Command::FindElement(locator), json); - } - - #[test] - fn test_command_with_wrapper_params() { - let cookie = Cookie { - name: "hello".into(), - value: "world".into(), - path: None, - domain: None, - secure: false, - http_only: false, - expiry: Some(Date(1564488092)), - same_site: None, - }; - let json = json!({"WebDriver:AddCookie": {"cookie": {"name": "hello", "value": "world", "secure": false, "httpOnly": false, "expiry": 1564488092}}}); - assert_ser_de(&Command::AddCookie(cookie), json); - } - - #[test] - fn test_empty_commands() { - assert_ser_de(&Command::GetTimeouts, json!("WebDriver:GetTimeouts")); - } - - #[test] - fn test_json_command_invalid() { - assert!(serde_json::from_value::(json!("foo")).is_err()); - } - - #[test] - fn test_json_delete_cookie_command() { - let json = json!({"WebDriver:DeleteCookie": {"name": "foo"}}); - assert_ser_de(&Command::DeleteCookie("foo".into()), json); - } - - #[test] - fn test_json_new_window_command() { - let data = NewWindow { - type_hint: Some("foo".into()), - }; - let json = json!({"WebDriver:NewWindow": {"type": "foo"}}); - assert_ser_de(&Command::NewWindow(data), json); - } - - #[test] - fn test_json_new_window_command_with_none_value() { - let data = NewWindow { type_hint: None }; - let json = json!({"WebDriver:NewWindow": {}}); - assert_ser_de(&Command::NewWindow(data), json); - } - - #[test] - fn test_json_command_as_struct() { - assert_ser( - &Command::FindElementElement { - element: "foo".into(), - using: Selector::XPath, - value: "bar".into(), - }, - json!({"WebDriver:FindElement": {"element": "foo", "using": "xpath", "value": "bar" }}), - ); - } - - #[test] - fn test_json_get_computed_label_command() { - assert_ser_de( - &Command::GetComputedLabel { id: "foo".into() }, - json!({"WebDriver:GetComputedLabel": {"id": "foo"}}), - ); - } - - #[test] - fn test_json_get_computed_role_command() { - assert_ser_de( - &Command::GetComputedRole { id: "foo".into() }, - json!({"WebDriver:GetComputedRole": {"id": "foo"}}), - ); - } - - #[test] - fn test_json_get_css_value() { - assert_ser_de( - &Command::GetCSSValue { - id: "foo".into(), - property: "bar".into(), - }, - json!({"WebDriver:GetElementCSSValue": {"id": "foo", "propertyName": "bar"}}), - ); - } - - #[test] - fn test_json_find_shadow_root_element() { - assert_ser_de( - &Command::FindShadowRootElement { - shadow_root: "foo".into(), - using: Selector::Css, - value: "bar".into(), - }, - json!({"WebDriver:FindElementFromShadowRoot": {"shadowRoot": "foo", "using": "css selector", "value": "bar"}}), - ); - } - - #[test] - fn test_json_find_shadow_root_elements() { - assert_ser_de( - &Command::FindShadowRootElements { - shadow_root: "foo".into(), - using: Selector::Css, - value: "bar".into(), - }, - json!({"WebDriver:FindElementsFromShadowRoot": {"shadowRoot": "foo", "using": "css selector", "value": "bar"}}), - ); - } -} diff --git a/python/drivers/geckodriver-0.33.0/src/android.rs b/python/drivers/geckodriver-0.33.0/src/android.rs deleted file mode 100644 index 10293d5..0000000 --- a/python/drivers/geckodriver-0.33.0/src/android.rs +++ /dev/null @@ -1,533 +0,0 @@ -use crate::capabilities::AndroidOptions; -use mozdevice::{AndroidStorage, Device, Host, UnixPathBuf}; -use mozprofile::profile::Profile; -use serde::Serialize; -use serde_yaml::{Mapping, Value}; -use std::fmt; -use std::io; -use std::time; -use webdriver::error::{ErrorStatus, WebDriverError}; - -// TODO: avoid port clashes across GeckoView-vehicles. -// For now, we always use target port 2829, leading to issues like bug 1533704. -const MARIONETTE_TARGET_PORT: u16 = 2829; - -const CONFIG_FILE_HEADING: &str = r#"## GeckoView configuration YAML -## -## Auto-generated by geckodriver. -## See https://mozilla.github.io/geckoview/consumer/docs/automation. -"#; - -pub type Result = std::result::Result; - -#[derive(Debug)] -pub enum AndroidError { - ActivityNotFound(String), - Device(mozdevice::DeviceError), - IO(io::Error), - PackageNotFound(String), - Serde(serde_yaml::Error), -} - -impl fmt::Display for AndroidError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - AndroidError::ActivityNotFound(ref package) => { - write!(f, "Activity for package '{}' not found", package) - } - AndroidError::Device(ref message) => message.fmt(f), - AndroidError::IO(ref message) => message.fmt(f), - AndroidError::PackageNotFound(ref package) => { - write!(f, "Package '{}' not found", package) - } - AndroidError::Serde(ref message) => message.fmt(f), - } - } -} - -impl From for AndroidError { - fn from(value: io::Error) -> AndroidError { - AndroidError::IO(value) - } -} - -impl From for AndroidError { - fn from(value: mozdevice::DeviceError) -> AndroidError { - AndroidError::Device(value) - } -} - -impl From for AndroidError { - fn from(value: serde_yaml::Error) -> AndroidError { - AndroidError::Serde(value) - } -} - -impl From for WebDriverError { - fn from(value: AndroidError) -> WebDriverError { - WebDriverError::new(ErrorStatus::UnknownError, value.to_string()) - } -} - -/// A remote Gecko instance. -/// -/// Host refers to the device running `geckodriver`. Target refers to the -/// Android device running Gecko in a GeckoView-based vehicle. -#[derive(Debug)] -pub struct AndroidProcess { - pub device: Device, - pub package: String, - pub activity: String, -} - -impl AndroidProcess { - pub fn new( - device: Device, - package: String, - activity: String, - ) -> mozdevice::Result { - Ok(AndroidProcess { - device, - package, - activity, - }) - } -} - -#[derive(Debug)] -pub struct AndroidHandler { - pub config: UnixPathBuf, - pub options: AndroidOptions, - pub process: AndroidProcess, - pub profile: UnixPathBuf, - pub test_root: UnixPathBuf, - - // Port forwarding for Marionette: host => target - pub marionette_host_port: u16, - pub marionette_target_port: u16, - - // Port forwarding for WebSocket connections (WebDriver BiDi and CDP) - pub websocket_port: Option, -} - -impl Drop for AndroidHandler { - fn drop(&mut self) { - // Try to clean up various settings - let clear_command = format!("am clear-debug-app {}", self.process.package); - match self - .process - .device - .execute_host_shell_command(&clear_command) - { - Ok(_) => debug!("Disabled reading from configuration file"), - Err(e) => error!("Failed disabling from configuration file: {}", e), - } - - match self.process.device.remove(&self.config) { - Ok(_) => debug!("Deleted GeckoView configuration file"), - Err(e) => error!("Failed deleting GeckoView configuration file: {}", e), - } - - match self.process.device.remove(&self.test_root) { - Ok(_) => debug!("Deleted test root folder: {}", &self.test_root.display()), - Err(e) => error!("Failed deleting test root folder: {}", e), - } - - match self - .process - .device - .kill_forward_port(self.marionette_host_port) - { - Ok(_) => debug!( - "Marionette port forward ({} -> {}) stopped", - &self.marionette_host_port, &self.marionette_target_port - ), - Err(e) => error!( - "Marionette port forward ({} -> {}) failed to stop: {}", - &self.marionette_host_port, &self.marionette_target_port, e - ), - } - - if let Some(port) = self.websocket_port { - match self.process.device.kill_forward_port(port) { - Ok(_) => debug!("WebSocket port forward ({0} -> {0}) stopped", &port), - Err(e) => error!( - "WebSocket port forward ({0} -> {0}) failed to stop: {1}", - &port, e - ), - } - } - } -} - -impl AndroidHandler { - pub fn new( - options: &AndroidOptions, - marionette_host_port: u16, - websocket_port: Option, - ) -> Result { - // We need to push profile.pathbuf to a safe space on the device. - // Make it per-Android package to avoid clashes and confusion. - // This naming scheme follows GeckoView's configuration file naming scheme, - // see bug 1533385. - - let host = Host { - host: None, - port: None, - read_timeout: Some(time::Duration::from_millis(5000)), - write_timeout: Some(time::Duration::from_millis(5000)), - }; - - let mut device = host.device_or_default(options.device_serial.as_ref(), options.storage)?; - - // Set up port forwarding for Marionette. - device.forward_port(marionette_host_port, MARIONETTE_TARGET_PORT)?; - debug!( - "Marionette port forward ({} -> {}) started", - marionette_host_port, MARIONETTE_TARGET_PORT - ); - - if let Some(port) = websocket_port { - // Set up port forwarding for WebSocket connections (WebDriver BiDi, and CDP). - device.forward_port(port, port)?; - debug!("WebSocket port forward ({} -> {}) started", port, port); - } - - let test_root = match device.storage { - AndroidStorage::App => { - device.run_as_package = Some(options.package.to_owned()); - let mut buf = UnixPathBuf::from("/data/data"); - buf.push(&options.package); - buf.push("test_root"); - buf - } - AndroidStorage::Internal => UnixPathBuf::from("/data/local/tmp/test_root"), - AndroidStorage::Sdcard => { - // We need to push the profile to a location on the device that can also - // be read and write by the application, and works for unrooted devices. - // The only location that meets this criteria is under: - // $EXTERNAL_STORAGE/Android/data/%options.package%/files - let response = device.execute_host_shell_command("echo $EXTERNAL_STORAGE")?; - let mut buf = UnixPathBuf::from(response.trim_end_matches('\n')); - buf.push("Android/data"); - buf.push(&options.package); - buf.push("files/test_root"); - buf - } - }; - - debug!( - "Connecting: options={:?}, storage={:?}) test_root={}, run_as_package={:?}", - options, - device.storage, - test_root.display(), - device.run_as_package - ); - - let mut profile = test_root.clone(); - profile.push(format!("{}-geckodriver-profile", &options.package)); - - // Check if the specified package is installed - let response = - device.execute_host_shell_command(&format!("pm list packages {}", &options.package))?; - let mut packages = response - .trim() - .split_terminator('\n') - .filter(|line| line.starts_with("package:")) - .map(|line| line.rsplit(':').next().expect("Package name found")); - if !packages.any(|x| x == options.package.as_str()) { - return Err(AndroidError::PackageNotFound(options.package.clone())); - } - - let config = UnixPathBuf::from(format!( - "/data/local/tmp/{}-geckoview-config.yaml", - &options.package - )); - - // If activity hasn't been specified default to the main activity of the package - let activity = match options.activity { - Some(ref activity) => activity.clone(), - None => { - let response = device.execute_host_shell_command(&format!( - "cmd package resolve-activity --brief {}", - &options.package - ))?; - let activities = response - .split_terminator('\n') - .filter(|line| line.starts_with(&options.package)) - .map(|line| line.rsplit('/').next().unwrap()) - .collect::>(); - if activities.is_empty() { - return Err(AndroidError::ActivityNotFound(options.package.clone())); - } - - activities[0].to_owned() - } - }; - - let process = AndroidProcess::new(device, options.package.clone(), activity)?; - - Ok(AndroidHandler { - config, - process, - profile, - test_root, - marionette_host_port, - marionette_target_port: MARIONETTE_TARGET_PORT, - options: options.clone(), - websocket_port, - }) - } - - pub fn generate_config_file( - &self, - args: Option>, - envs: I, - ) -> Result - where - I: IntoIterator, - K: ToString, - V: ToString, - { - // To configure GeckoView, we use the automation techniques documented at - // https://mozilla.github.io/geckoview/consumer/docs/automation. - #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] - pub struct Config { - pub env: Mapping, - pub args: Vec, - } - - let mut config = Config { - args: vec![ - "--marionette".into(), - "--profile".into(), - self.profile.display().to_string(), - ], - env: Mapping::new(), - }; - - config.args.append(&mut args.unwrap_or_default()); - - for (key, value) in envs { - config.env.insert( - Value::String(key.to_string()), - Value::String(value.to_string()), - ); - } - - config.env.insert( - Value::String("MOZ_CRASHREPORTER".to_owned()), - Value::String("1".to_owned()), - ); - config.env.insert( - Value::String("MOZ_CRASHREPORTER_NO_REPORT".to_owned()), - Value::String("1".to_owned()), - ); - config.env.insert( - Value::String("MOZ_CRASHREPORTER_SHUTDOWN".to_owned()), - Value::String("1".to_owned()), - ); - - let mut contents: Vec = vec![CONFIG_FILE_HEADING.to_owned()]; - contents.push(serde_yaml::to_string(&config)?); - - Ok(contents.concat()) - } - - pub fn prepare( - &self, - profile: &Profile, - args: Option>, - env: I, - ) -> Result<()> - where - I: IntoIterator, - K: ToString, - V: ToString, - { - self.process.device.clear_app_data(&self.process.package)?; - - // These permissions, at least, are required to read profiles in /mnt/sdcard. - for perm in &["READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE"] { - self.process.device.execute_host_shell_command(&format!( - "pm grant {} android.permission.{}", - &self.process.package, perm - ))?; - } - - // Make sure to create the test root. - self.process.device.create_dir(&self.test_root)?; - self.process.device.chmod(&self.test_root, "777", true)?; - - // Replace the profile - self.process.device.remove(&self.profile)?; - self.process - .device - .push_dir(&profile.path, &self.profile, 0o777)?; - - let contents = self.generate_config_file(args, env)?; - debug!("Content of generated GeckoView config file:\n{}", contents); - let reader = &mut io::BufReader::new(contents.as_bytes()); - - debug!( - "Pushing GeckoView configuration file to {}", - self.config.display() - ); - self.process.device.push(reader, &self.config, 0o777)?; - - // Tell GeckoView to read configuration even when `android:debuggable="false"`. - self.process.device.execute_host_shell_command(&format!( - "am set-debug-app --persistent {}", - self.process.package - ))?; - - Ok(()) - } - - pub fn launch(&self) -> Result<()> { - // TODO: Remove the usage of intent arguments once Fennec is no longer - // supported. Packages which are using GeckoView always read the arguments - // via the YAML configuration file. - let mut intent_arguments = self - .options - .intent_arguments - .clone() - .unwrap_or_else(|| Vec::with_capacity(3)); - intent_arguments.push("--es".to_owned()); - intent_arguments.push("args".to_owned()); - intent_arguments.push(format!("--marionette --profile {}", self.profile.display())); - - debug!( - "Launching {}/{}", - self.process.package, self.process.activity - ); - self.process - .device - .launch( - &self.process.package, - &self.process.activity, - &intent_arguments, - ) - .map_err(|e| { - let message = format!( - "Could not launch Android {}/{}: {}", - self.process.package, self.process.activity, e - ); - mozdevice::DeviceError::Adb(message) - })?; - - Ok(()) - } - - pub fn force_stop(&self) -> Result<()> { - debug!( - "Force stopping the Android package: {}", - &self.process.package - ); - self.process.device.force_stop(&self.process.package)?; - - Ok(()) - } -} - -#[cfg(test)] -mod test { - // To successfully run those tests the geckoview_example package needs to - // be installed on the device or emulator. After setting up the build - // environment (https://mzl.la/3muLv5M), the following mach commands have to - // be executed: - // - // $ ./mach build && ./mach install - // - // Currently the mozdevice API is not safe for multiple requests at the same - // time. It is recommended to run each of the unit tests on its own. Also adb - // specific tests cannot be run in CI yet. To check those locally, also run - // the ignored tests. - // - // Use the following command to accomplish that: - // - // $ cargo test -- --ignored --test-threads=1 - - use crate::android::AndroidHandler; - use crate::capabilities::AndroidOptions; - use mozdevice::{AndroidStorage, AndroidStorageInput, UnixPathBuf}; - - fn run_handler_storage_test(package: &str, storage: AndroidStorageInput) { - let options = AndroidOptions::new(package.to_owned(), storage); - let handler = AndroidHandler::new(&options, 4242, None).expect("has valid Android handler"); - - assert_eq!(handler.options, options); - assert_eq!(handler.process.package, package); - - let expected_config_path = UnixPathBuf::from(format!( - "/data/local/tmp/{}-geckoview-config.yaml", - &package - )); - assert_eq!(handler.config, expected_config_path); - - if handler.process.device.storage == AndroidStorage::App { - assert_eq!( - handler.process.device.run_as_package, - Some(package.to_owned()) - ); - } else { - assert_eq!(handler.process.device.run_as_package, None); - } - - let test_root = match handler.process.device.storage { - AndroidStorage::App => { - let mut buf = UnixPathBuf::from("/data/data"); - buf.push(&package); - buf.push("test_root"); - buf - } - AndroidStorage::Internal => UnixPathBuf::from("/data/local/tmp/test_root"), - AndroidStorage::Sdcard => { - let response = handler - .process - .device - .execute_host_shell_command("echo $EXTERNAL_STORAGE") - .unwrap(); - - let mut buf = UnixPathBuf::from(response.trim_end_matches('\n')); - buf.push("Android/data/"); - buf.push(&package); - buf.push("files/test_root"); - buf - } - }; - assert_eq!(handler.test_root, test_root); - - let mut profile = test_root; - profile.push(format!("{}-geckodriver-profile", &package)); - assert_eq!(handler.profile, profile); - } - - #[test] - #[ignore] - fn android_handler_storage_as_app() { - let package = "org.mozilla.geckoview_example"; - run_handler_storage_test(package, AndroidStorageInput::App); - } - - #[test] - #[ignore] - fn android_handler_storage_as_auto() { - let package = "org.mozilla.geckoview_example"; - run_handler_storage_test(package, AndroidStorageInput::Auto); - } - - #[test] - #[ignore] - fn android_handler_storage_as_internal() { - let package = "org.mozilla.geckoview_example"; - run_handler_storage_test(package, AndroidStorageInput::Internal); - } - - #[test] - #[ignore] - fn android_handler_storage_as_sdcard() { - let package = "org.mozilla.geckoview_example"; - run_handler_storage_test(package, AndroidStorageInput::Sdcard); - } -} diff --git a/python/drivers/geckodriver-0.33.0/src/browser.rs b/python/drivers/geckodriver-0.33.0/src/browser.rs deleted file mode 100644 index 7d99d9b..0000000 --- a/python/drivers/geckodriver-0.33.0/src/browser.rs +++ /dev/null @@ -1,554 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use crate::android::AndroidHandler; -use crate::capabilities::{FirefoxOptions, ProfileType}; -use crate::logging; -use crate::prefs; -use mozprofile::preferences::Pref; -use mozprofile::profile::{PrefFile, Profile}; -use mozrunner::runner::{FirefoxProcess, FirefoxRunner, Runner, RunnerProcess}; -use std::fs; -use std::io::Read; -use std::path::{Path, PathBuf}; -use std::time; -use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; - -/// A running Gecko instance. -#[derive(Debug)] -#[allow(clippy::large_enum_variant)] -pub(crate) enum Browser { - Local(LocalBrowser), - Remote(RemoteBrowser), - - /// An existing browser instance not controlled by GeckoDriver - Existing(u16), -} - -impl Browser { - pub(crate) fn close(self, wait_for_shutdown: bool) -> WebDriverResult<()> { - match self { - Browser::Local(x) => x.close(wait_for_shutdown), - Browser::Remote(x) => x.close(), - Browser::Existing(_) => Ok(()), - } - } - - pub(crate) fn marionette_port(&mut self) -> WebDriverResult> { - match self { - Browser::Local(x) => x.marionette_port(), - Browser::Remote(x) => x.marionette_port(), - Browser::Existing(x) => Ok(Some(*x)), - } - } - - pub(crate) fn update_marionette_port(&mut self, port: u16) { - match self { - Browser::Local(x) => x.update_marionette_port(port), - Browser::Remote(x) => x.update_marionette_port(port), - Browser::Existing(x) => { - if port != *x { - error!( - "Cannot re-assign Marionette port when connected to an existing browser" - ); - } - } - } - } -} - -#[derive(Debug)] -/// A local Firefox process, running on this (host) device. -pub(crate) struct LocalBrowser { - marionette_port: u16, - prefs_backup: Option, - process: FirefoxProcess, - profile_path: Option, -} - -impl LocalBrowser { - pub(crate) fn new( - options: FirefoxOptions, - marionette_port: u16, - jsdebugger: bool, - profile_root: Option<&Path>, - ) -> WebDriverResult { - let binary = options.binary.ok_or_else(|| { - WebDriverError::new( - ErrorStatus::SessionNotCreated, - "Expected browser binary location, but unable to find \ - binary in default location, no \ - 'moz:firefoxOptions.binary' capability provided, and \ - no binary flag set on the command line", - ) - })?; - - let is_custom_profile = matches!(options.profile, ProfileType::Path(_)); - - let mut profile = match options.profile { - ProfileType::Named => None, - ProfileType::Path(x) => Some(x), - ProfileType::Temporary => Some(Profile::new(profile_root)?), - }; - - let (profile_path, prefs_backup) = if let Some(ref mut profile) = profile { - let profile_path = profile.path.clone(); - let prefs_backup = set_prefs( - marionette_port, - profile, - is_custom_profile, - options.prefs, - jsdebugger, - ) - .map_err(|e| { - WebDriverError::new( - ErrorStatus::SessionNotCreated, - format!("Failed to set preferences: {}", e), - ) - })?; - (Some(profile_path), prefs_backup) - } else { - warn!("Unable to set geckodriver prefs when using a named profile"); - (None, None) - }; - - let mut runner = FirefoxRunner::new(&binary, profile); - - runner.arg("--marionette"); - if jsdebugger { - runner.arg("--jsdebugger"); - } - if let Some(args) = options.args.as_ref() { - runner.args(args); - } - - // https://developer.mozilla.org/docs/Environment_variables_affecting_crash_reporting - runner - .env("MOZ_CRASHREPORTER", "1") - .env("MOZ_CRASHREPORTER_NO_REPORT", "1") - .env("MOZ_CRASHREPORTER_SHUTDOWN", "1"); - - let process = match runner.start() { - Ok(process) => process, - Err(e) => { - if let Some(backup) = prefs_backup { - backup.restore(); - } - return Err(WebDriverError::new( - ErrorStatus::SessionNotCreated, - format!("Failed to start browser {}: {}", binary.display(), e), - )); - } - }; - - Ok(LocalBrowser { - marionette_port, - prefs_backup, - process, - profile_path, - }) - } - - fn close(mut self, wait_for_shutdown: bool) -> WebDriverResult<()> { - if wait_for_shutdown { - // TODO(https://bugzil.la/1443922): - // Use toolkit.asyncshutdown.crash_timout pref - let duration = time::Duration::from_secs(70); - match self.process.wait(duration) { - Ok(x) => debug!("Browser process stopped: {}", x), - Err(e) => error!("Failed to stop browser process: {}", e), - } - } - self.process.kill()?; - - // Restoring the prefs if the browser fails to stop perhaps doesn't work anyway - if let Some(prefs_backup) = self.prefs_backup { - prefs_backup.restore(); - }; - - Ok(()) - } - - fn marionette_port(&mut self) -> WebDriverResult> { - if self.marionette_port != 0 { - return Ok(Some(self.marionette_port)); - } - - if let Some(profile_path) = self.profile_path.as_ref() { - return Ok(read_marionette_port(profile_path)); - } - - // This should be impossible, but it isn't enforced - Err(WebDriverError::new( - ErrorStatus::SessionNotCreated, - "Port not known when using named profile", - )) - } - - fn update_marionette_port(&mut self, port: u16) { - self.marionette_port = port; - } - - pub(crate) fn check_status(&mut self) -> Option { - match self.process.try_wait() { - Ok(Some(status)) => Some( - status - .code() - .map(|c| c.to_string()) - .unwrap_or_else(|| "signal".into()), - ), - Ok(None) => None, - Err(_) => Some("{unknown}".into()), - } - } -} - -fn read_marionette_port(profile_path: &Path) -> Option { - let port_file = profile_path.join("MarionetteActivePort"); - let mut port_str = String::with_capacity(6); - let mut file = match fs::File::open(&port_file) { - Ok(file) => file, - Err(_) => { - trace!("Failed to open {}", &port_file.to_string_lossy()); - return None; - } - }; - if let Err(e) = file.read_to_string(&mut port_str) { - trace!("Failed to read {}: {}", &port_file.to_string_lossy(), e); - return None; - }; - println!("Read port: {}", port_str); - let port = port_str.parse::().ok(); - if port.is_none() { - warn!("Failed fo convert {} to u16", &port_str); - } - port -} - -#[derive(Debug)] -/// A remote instance, running on a (target) Android device. -pub(crate) struct RemoteBrowser { - handler: AndroidHandler, - marionette_port: u16, - prefs_backup: Option, -} - -impl RemoteBrowser { - pub(crate) fn new( - options: FirefoxOptions, - marionette_port: u16, - websocket_port: Option, - profile_root: Option<&Path>, - ) -> WebDriverResult { - let android_options = options.android.unwrap(); - - let handler = AndroidHandler::new(&android_options, marionette_port, websocket_port)?; - - // Profile management. - let (mut profile, is_custom_profile) = match options.profile { - ProfileType::Named => { - return Err(WebDriverError::new( - ErrorStatus::SessionNotCreated, - "Cannot use a named profile on Android", - )); - } - ProfileType::Path(x) => (x, true), - ProfileType::Temporary => (Profile::new(profile_root)?, false), - }; - - let prefs_backup = set_prefs( - handler.marionette_target_port, - &mut profile, - is_custom_profile, - options.prefs, - false, - ) - .map_err(|e| { - WebDriverError::new( - ErrorStatus::SessionNotCreated, - format!("Failed to set preferences: {}", e), - ) - })?; - - handler.prepare(&profile, options.args, options.env.unwrap_or_default())?; - - handler.launch()?; - - Ok(RemoteBrowser { - handler, - marionette_port, - prefs_backup, - }) - } - - fn close(self) -> WebDriverResult<()> { - self.handler.force_stop()?; - - // Restoring the prefs if the browser fails to stop perhaps doesn't work anyway - if let Some(prefs_backup) = self.prefs_backup { - prefs_backup.restore(); - }; - - Ok(()) - } - - fn marionette_port(&mut self) -> WebDriverResult> { - Ok(Some(self.marionette_port)) - } - - fn update_marionette_port(&mut self, port: u16) { - self.marionette_port = port; - } -} - -fn set_prefs( - port: u16, - profile: &mut Profile, - custom_profile: bool, - extra_prefs: Vec<(String, Pref)>, - js_debugger: bool, -) -> WebDriverResult> { - let prefs = profile.user_prefs().map_err(|_| { - WebDriverError::new( - ErrorStatus::UnknownError, - "Unable to read profile preferences file", - ) - })?; - - let backup_prefs = if custom_profile && prefs.path.exists() { - Some(PrefsBackup::new(prefs)?) - } else { - None - }; - - for &(name, ref value) in prefs::DEFAULT.iter() { - if !custom_profile || !prefs.contains_key(name) { - prefs.insert(name.to_string(), (*value).clone()); - } - } - - prefs.insert_slice(&extra_prefs[..]); - - if js_debugger { - prefs.insert("devtools.browsertoolbox.panel", Pref::new("jsdebugger")); - prefs.insert("devtools.debugger.remote-enabled", Pref::new(true)); - prefs.insert("devtools.chrome.enabled", Pref::new(true)); - prefs.insert("devtools.debugger.prompt-connection", Pref::new(false)); - } - - prefs.insert("marionette.port", Pref::new(port)); - prefs.insert("remote.log.level", logging::max_level().into()); - - prefs.write().map_err(|e| { - WebDriverError::new( - ErrorStatus::UnknownError, - format!("Unable to write Firefox profile: {}", e), - ) - })?; - Ok(backup_prefs) -} - -#[derive(Debug)] -struct PrefsBackup { - orig_path: PathBuf, - backup_path: PathBuf, -} - -impl PrefsBackup { - fn new(prefs: &PrefFile) -> WebDriverResult { - let mut prefs_backup_path = prefs.path.clone(); - let mut counter = 0; - while { - let ext = if counter > 0 { - format!("geckodriver_backup_{}", counter) - } else { - "geckodriver_backup".to_string() - }; - prefs_backup_path.set_extension(ext); - prefs_backup_path.exists() - } { - counter += 1 - } - debug!("Backing up prefs to {:?}", prefs_backup_path); - fs::copy(&prefs.path, &prefs_backup_path)?; - - Ok(PrefsBackup { - orig_path: prefs.path.clone(), - backup_path: prefs_backup_path, - }) - } - - fn restore(self) { - if self.backup_path.exists() { - let _ = fs::rename(self.backup_path, self.orig_path); - } - } -} - -#[cfg(test)] -mod tests { - use super::set_prefs; - use crate::browser::read_marionette_port; - use crate::capabilities::{FirefoxOptions, ProfileType}; - use mozprofile::preferences::{Pref, PrefValue}; - use mozprofile::profile::Profile; - use serde_json::{Map, Value}; - use std::fs::File; - use std::io::{Read, Write}; - use std::path::Path; - use tempfile::tempdir; - - fn example_profile() -> Value { - let mut profile_data = Vec::with_capacity(1024); - let mut profile = File::open("src/tests/profile.zip").unwrap(); - profile.read_to_end(&mut profile_data).unwrap(); - Value::String(base64::encode(&profile_data)) - } - - // This is not a pretty test, mostly due to the nature of - // mozprofile's and MarionetteHandler's APIs, but we have had - // several regressions related to remote.log.level. - #[test] - fn test_remote_log_level() { - let mut profile = Profile::new(None).unwrap(); - set_prefs(2828, &mut profile, false, vec![], false).ok(); - let user_prefs = profile.user_prefs().unwrap(); - - let pref = user_prefs.get("remote.log.level").unwrap(); - let value = match pref.value { - PrefValue::String(ref s) => s, - _ => panic!(), - }; - for (i, ch) in value.chars().enumerate() { - if i == 0 { - assert!(ch.is_uppercase()); - } else { - assert!(ch.is_lowercase()); - } - } - } - - #[test] - fn test_prefs() { - let marionette_settings = Default::default(); - - let encoded_profile = example_profile(); - let mut prefs: Map = Map::new(); - prefs.insert( - "browser.display.background_color".into(), - Value::String("#00ff00".into()), - ); - - let mut firefox_opts = Map::new(); - firefox_opts.insert("profile".into(), encoded_profile); - firefox_opts.insert("prefs".into(), Value::Object(prefs)); - - let mut caps = Map::new(); - caps.insert("moz:firefoxOptions".into(), Value::Object(firefox_opts)); - - let opts = FirefoxOptions::from_capabilities(None, &marionette_settings, &mut caps) - .expect("Valid profile and prefs"); - - let mut profile = match opts.profile { - ProfileType::Path(profile) => profile, - _ => panic!("Expected ProfileType::Path"), - }; - - set_prefs(2828, &mut profile, true, opts.prefs, false).expect("set preferences"); - - let prefs_set = profile.user_prefs().expect("valid user preferences"); - println!("{:#?}", prefs_set.prefs); - - assert_eq!( - prefs_set.get("startup.homepage_welcome_url"), - Some(&Pref::new("data:text/html,PASS")) - ); - assert_eq!( - prefs_set.get("browser.display.background_color"), - Some(&Pref::new("#00ff00")) - ); - assert_eq!(prefs_set.get("marionette.port"), Some(&Pref::new(2828))); - } - - #[test] - fn test_pref_backup() { - let mut profile = Profile::new(None).unwrap(); - - // Create some prefs in the profile - let initial_prefs = profile.user_prefs().unwrap(); - initial_prefs.insert("geckodriver.example", Pref::new("example")); - initial_prefs.write().unwrap(); - - let prefs_path = initial_prefs.path.clone(); - - let mut conflicting_backup_path = initial_prefs.path.clone(); - conflicting_backup_path.set_extension("geckodriver_backup"); - println!("{:?}", conflicting_backup_path); - let mut file = File::create(&conflicting_backup_path).unwrap(); - file.write_all(b"test").unwrap(); - assert!(conflicting_backup_path.exists()); - - let mut initial_prefs_data = String::new(); - File::open(&prefs_path) - .expect("Initial prefs exist") - .read_to_string(&mut initial_prefs_data) - .unwrap(); - - let backup = set_prefs(2828, &mut profile, true, vec![], false) - .unwrap() - .unwrap(); - let user_prefs = profile.user_prefs().unwrap(); - - assert!(user_prefs.path.exists()); - let mut backup_path = user_prefs.path.clone(); - backup_path.set_extension("geckodriver_backup_1"); - - assert!(backup_path.exists()); - - // Ensure the actual prefs contain both the existing ones and the ones we added - let pref = user_prefs.get("marionette.port").unwrap(); - assert_eq!(pref.value, PrefValue::Int(2828)); - - let pref = user_prefs.get("geckodriver.example").unwrap(); - assert_eq!(pref.value, PrefValue::String("example".into())); - - // Ensure the backup prefs don't contain the new settings - let mut backup_data = String::new(); - File::open(&backup_path) - .expect("Backup prefs exist") - .read_to_string(&mut backup_data) - .unwrap(); - assert_eq!(backup_data, initial_prefs_data); - - backup.restore(); - - assert!(!backup_path.exists()); - let mut final_prefs_data = String::new(); - File::open(&prefs_path) - .expect("Initial prefs exist") - .read_to_string(&mut final_prefs_data) - .unwrap(); - assert_eq!(final_prefs_data, initial_prefs_data); - } - - #[test] - fn test_local_read_marionette_port() { - fn create_port_file(profile_path: &Path, data: &[u8]) { - let port_path = profile_path.join("MarionetteActivePort"); - let mut file = File::create(&port_path).unwrap(); - file.write_all(data).unwrap(); - } - - let profile_dir = tempdir().unwrap(); - let profile_path = profile_dir.path(); - assert_eq!(read_marionette_port(profile_path), None); - assert_eq!(read_marionette_port(profile_path), None); - create_port_file(profile_path, b""); - assert_eq!(read_marionette_port(profile_path), None); - create_port_file(profile_path, b"1234"); - assert_eq!(read_marionette_port(profile_path), Some(1234)); - create_port_file(profile_path, b"1234abc"); - assert_eq!(read_marionette_port(profile_path), None); - } -} diff --git a/python/drivers/geckodriver-0.33.0/src/build.rs b/python/drivers/geckodriver-0.33.0/src/build.rs deleted file mode 100644 index f77a336..0000000 --- a/python/drivers/geckodriver-0.33.0/src/build.rs +++ /dev/null @@ -1,47 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use serde_json::Value; -use std::fmt; - -include!(concat!(env!("OUT_DIR"), "/build-info.rs")); - -pub struct BuildInfo; - -impl BuildInfo { - pub fn version() -> &'static str { - crate_version!() - } - - pub fn hash() -> Option<&'static str> { - COMMIT_HASH - } - - pub fn date() -> Option<&'static str> { - COMMIT_DATE - } -} - -impl fmt::Display for BuildInfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", BuildInfo::version())?; - match (BuildInfo::hash(), BuildInfo::date()) { - (Some(hash), Some(date)) => write!(f, " ({} {})", hash, date)?, - (Some(hash), None) => write!(f, " ({})", hash)?, - _ => {} - } - Ok(()) - } -} - -impl From for Value { - fn from(_: BuildInfo) -> Value { - Value::String(BuildInfo::version().to_string()) - } -} - -/// Returns build-time information about geckodriver. -pub fn build_info() -> BuildInfo { - BuildInfo {} -} diff --git a/python/drivers/geckodriver-0.33.0/src/capabilities.rs b/python/drivers/geckodriver-0.33.0/src/capabilities.rs deleted file mode 100644 index 73e1452..0000000 --- a/python/drivers/geckodriver-0.33.0/src/capabilities.rs +++ /dev/null @@ -1,1415 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use crate::command::LogOptions; -use crate::logging::Level; -use crate::marionette::MarionetteSettings; -use mozdevice::AndroidStorageInput; -use mozprofile::preferences::Pref; -use mozprofile::profile::Profile; -use mozrunner::firefox_args::{get_arg_value, parse_args, Arg}; -use mozrunner::runner::platform::firefox_default_path; -use mozversion::{self, firefox_binary_version, firefox_version, Version}; -use regex::bytes::Regex; -use serde_json::{Map, Value}; -use std::collections::BTreeMap; -use std::default::Default; -use std::ffi::OsString; -use std::fmt::{self, Display}; -use std::fs; -use std::io; -use std::io::BufWriter; -use std::io::Cursor; -use std::path::{Path, PathBuf}; -use std::str::{self, FromStr}; -use webdriver::capabilities::{BrowserCapabilities, Capabilities}; -use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; - -#[derive(Clone, Debug)] -enum VersionError { - VersionError(mozversion::Error), - MissingBinary, -} - -impl From for VersionError { - fn from(err: mozversion::Error) -> VersionError { - VersionError::VersionError(err) - } -} - -impl Display for VersionError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - VersionError::VersionError(ref x) => x.fmt(f), - VersionError::MissingBinary => "No binary provided".fmt(f), - } - } -} - -impl From for WebDriverError { - fn from(err: VersionError) -> WebDriverError { - WebDriverError::new(ErrorStatus::SessionNotCreated, err.to_string()) - } -} - -/// Provides matching of `moz:firefoxOptions` and resolutionnized of which Firefox -/// binary to use. -/// -/// `FirefoxCapabilities` is constructed with the fallback binary, should -/// `moz:firefoxOptions` not contain a binary entry. This may either be the -/// system Firefox installation or an override, for example given to the -/// `--binary` flag of geckodriver. -pub struct FirefoxCapabilities<'a> { - pub chosen_binary: Option, - fallback_binary: Option<&'a PathBuf>, - version_cache: BTreeMap>, -} - -impl<'a> FirefoxCapabilities<'a> { - pub fn new(fallback_binary: Option<&'a PathBuf>) -> FirefoxCapabilities<'a> { - FirefoxCapabilities { - chosen_binary: None, - fallback_binary, - version_cache: BTreeMap::new(), - } - } - - fn set_binary(&mut self, capabilities: &Map) { - self.chosen_binary = capabilities - .get("moz:firefoxOptions") - .and_then(|x| x.get("binary")) - .and_then(|x| x.as_str()) - .map(PathBuf::from) - .or_else(|| self.fallback_binary.cloned()) - .or_else(firefox_default_path); - } - - fn version(&mut self, binary: Option<&Path>) -> Result { - if let Some(binary) = binary { - if let Some(cache_value) = self.version_cache.get(binary) { - return cache_value.clone(); - } - let rv = self - .version_from_ini(binary) - .or_else(|_| self.version_from_binary(binary)); - if let Ok(ref version) = rv { - debug!("Found version {}", version); - } else { - debug!("Failed to get binary version"); - } - self.version_cache.insert(binary.to_path_buf(), rv.clone()); - rv - } else { - Err(VersionError::MissingBinary) - } - } - - fn version_from_ini(&self, binary: &Path) -> Result { - debug!("Trying to read firefox version from ini files"); - let version = firefox_version(binary)?; - if let Some(version_string) = version.version_string { - Version::from_str(&version_string).map_err(|err| err.into()) - } else { - Err(VersionError::VersionError( - mozversion::Error::MetadataError("Missing version string".into()), - )) - } - } - - fn version_from_binary(&self, binary: &Path) -> Result { - debug!("Trying to read firefox version from binary"); - Ok(firefox_binary_version(binary)?) - } -} - -impl<'a> BrowserCapabilities for FirefoxCapabilities<'a> { - fn init(&mut self, capabilities: &Capabilities) { - self.set_binary(capabilities); - } - - fn browser_name(&mut self, _: &Capabilities) -> WebDriverResult> { - Ok(Some("firefox".into())) - } - - fn browser_version(&mut self, _: &Capabilities) -> WebDriverResult> { - let binary = self.chosen_binary.clone(); - self.version(binary.as_ref().map(|x| x.as_ref())) - .map_err(|err| err.into()) - .map(|x| Some(x.to_string())) - } - - fn platform_name(&mut self, _: &Capabilities) -> WebDriverResult> { - Ok(if cfg!(target_os = "windows") { - Some("windows".into()) - } else if cfg!(target_os = "macos") { - Some("mac".into()) - } else if cfg!(target_os = "linux") { - Some("linux".into()) - } else { - None - }) - } - - fn accept_insecure_certs(&mut self, _: &Capabilities) -> WebDriverResult { - Ok(true) - } - - fn accept_proxy(&mut self, _: &Capabilities, _: &Capabilities) -> WebDriverResult { - Ok(true) - } - - fn set_window_rect(&mut self, _: &Capabilities) -> WebDriverResult { - Ok(true) - } - - fn compare_browser_version( - &mut self, - version: &str, - comparison: &str, - ) -> WebDriverResult { - Version::from_str(version) - .map_err(VersionError::from)? - .matches(comparison) - .map_err(|err| VersionError::from(err).into()) - } - - fn strict_file_interactability(&mut self, _: &Capabilities) -> WebDriverResult { - Ok(true) - } - - fn web_socket_url(&mut self, _: &Capabilities) -> WebDriverResult { - Ok(true) - } - - fn validate_custom(&mut self, name: &str, value: &Value) -> WebDriverResult<()> { - if !name.starts_with("moz:") { - return Ok(()); - } - match name { - "moz:firefoxOptions" => { - let data = try_opt!( - value.as_object(), - ErrorStatus::InvalidArgument, - "moz:firefoxOptions is not an object" - ); - for (key, value) in data.iter() { - match &**key { - "androidActivity" - | "androidDeviceSerial" - | "androidPackage" - | "profile" => { - if !value.is_string() { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("{} is not a string", &**key), - )); - } - } - "androidIntentArguments" | "args" => { - if !try_opt!( - value.as_array(), - ErrorStatus::InvalidArgument, - format!("{} is not an array", &**key) - ) - .iter() - .all(|value| value.is_string()) - { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("{} entry is not a string", &**key), - )); - } - } - "binary" => { - if let Some(binary) = value.as_str() { - if !data.contains_key("androidPackage") - && self.version(Some(Path::new(binary))).is_err() - { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("{} is not a Firefox executable", &**key), - )); - } - } else { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("{} is not a string", &**key), - )); - } - } - "env" => { - let env_data = try_opt!( - value.as_object(), - ErrorStatus::InvalidArgument, - "env value is not an object" - ); - if !env_data.values().all(Value::is_string) { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Environment values were not all strings", - )); - } - } - "log" => { - let log_data = try_opt!( - value.as_object(), - ErrorStatus::InvalidArgument, - "log value is not an object" - ); - for (log_key, log_value) in log_data.iter() { - match &**log_key { - "level" => { - let level = try_opt!( - log_value.as_str(), - ErrorStatus::InvalidArgument, - "log level is not a string" - ); - if Level::from_str(level).is_err() { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("Not a valid log level: {}", level), - )); - } - } - x => { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("Invalid log field {}", x), - )) - } - } - } - } - "prefs" => { - let prefs_data = try_opt!( - value.as_object(), - ErrorStatus::InvalidArgument, - "prefs value is not an object" - ); - let is_pref_value_type = |x: &Value| { - x.is_string() || x.is_i64() || x.is_u64() || x.is_boolean() - }; - if !prefs_data.values().all(is_pref_value_type) { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Preference values not all string or integer or boolean", - )); - } - } - x => { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("Invalid moz:firefoxOptions field {}", x), - )) - } - } - } - } - "moz:useNonSpecCompliantPointerOrigin" => { - warn!("You are using the deprecated vendor specific capability 'moz:useNonSpecCompliantPointerOrigin', which will be removed in Firefox 116."); - if !value.is_boolean() { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "moz:useNonSpecCompliantPointerOrigin is not a boolean", - )); - } - } - "moz:webdriverClick" => { - if !value.is_boolean() { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "moz:webdriverClick is not a boolean", - )); - } - } - "moz:debuggerAddress" => { - if !value.is_boolean() { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "moz:debuggerAddress is not a boolean", - )); - } - } - _ => { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("Unrecognised option {}", name), - )) - } - } - Ok(()) - } - - fn accept_custom(&mut self, _: &str, _: &Value, _: &Capabilities) -> WebDriverResult { - Ok(true) - } -} - -/// Android-specific options in the `moz:firefoxOptions` struct. -/// These map to "androidCamelCase", following [chromedriver's Android-specific -/// Capabilities](http://chromedriver.chromium.org/getting-started/getting-started---android). -#[derive(Default, Clone, Debug, PartialEq)] -pub struct AndroidOptions { - pub activity: Option, - pub device_serial: Option, - pub intent_arguments: Option>, - pub package: String, - pub storage: AndroidStorageInput, -} - -impl AndroidOptions { - pub fn new(package: String, storage: AndroidStorageInput) -> AndroidOptions { - AndroidOptions { - package, - storage, - ..Default::default() - } - } -} - -#[derive(Debug, PartialEq)] -pub enum ProfileType { - Path(Profile), - Named, - Temporary, -} - -impl Default for ProfileType { - fn default() -> Self { - ProfileType::Temporary - } -} - -/// Rust representation of `moz:firefoxOptions`. -/// -/// Calling `FirefoxOptions::from_capabilities(binary, capabilities)` causes -/// the encoded profile, the binary arguments, log settings, and additional -/// preferences to be checked and unmarshaled from the `moz:firefoxOptions` -/// JSON Object into a Rust representation. -#[derive(Default, Debug)] -pub struct FirefoxOptions { - pub binary: Option, - pub profile: ProfileType, - pub args: Option>, - pub env: Option>, - pub log: LogOptions, - pub prefs: Vec<(String, Pref)>, - pub android: Option, - pub use_websocket: bool, -} - -impl FirefoxOptions { - pub fn new() -> FirefoxOptions { - Default::default() - } - - pub(crate) fn from_capabilities( - binary_path: Option, - settings: &MarionetteSettings, - matched: &mut Capabilities, - ) -> WebDriverResult { - let mut rv = FirefoxOptions::new(); - rv.binary = binary_path; - - if let Some(json) = matched.remove("moz:firefoxOptions") { - let options = json.as_object().ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "'moz:firefoxOptions' \ - capability is not an object", - ) - })?; - - if options.get("androidPackage").is_some() && options.get("binary").is_some() { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "androidPackage and binary are mutual exclusive", - )); - } - - rv.android = FirefoxOptions::load_android(settings.android_storage, options)?; - rv.args = FirefoxOptions::load_args(options)?; - rv.env = FirefoxOptions::load_env(options)?; - rv.log = FirefoxOptions::load_log(options)?; - rv.prefs = FirefoxOptions::load_prefs(options)?; - if let Some(profile) = - FirefoxOptions::load_profile(settings.profile_root.as_deref(), options)? - { - rv.profile = ProfileType::Path(profile); - } - } - - if let Some(args) = rv.args.as_ref() { - let os_args = parse_args(args.iter().map(OsString::from).collect::>().iter()); - - if let Some(path) = get_arg_value(os_args.iter(), Arg::Profile) { - if let ProfileType::Path(_) = rv.profile { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Can't provide both a --profile argument and a profile", - )); - } - let path_buf = PathBuf::from(path); - rv.profile = ProfileType::Path(Profile::new_from_path(&path_buf)?); - } - - if get_arg_value(os_args.iter(), Arg::NamedProfile).is_some() { - if let ProfileType::Path(_) = rv.profile { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Can't provide both a -P argument and a profile", - )); - } - // See bug 1757720 - warn!("Firefox was configured to use a named profile (`-P `). \ - Support for named profiles will be removed in a future geckodriver release. \ - Please instead use the `--profile ` Firefox argument to start with an existing profile"); - rv.profile = ProfileType::Named; - } - - // Block these Firefox command line arguments that should not be settable - // via session capabilities. - if let Some(arg) = os_args - .iter() - .filter_map(|(opt_arg, _)| opt_arg.as_ref()) - .find(|arg| { - matches!( - arg, - Arg::Marionette - | Arg::RemoteAllowHosts - | Arg::RemoteAllowOrigins - | Arg::RemoteDebuggingPort - ) - }) - { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - format!("Argument {} can't be set via capabilities", arg), - )); - }; - } - - let has_web_socket_url = matched - .get("webSocketUrl") - .and_then(|x| x.as_bool()) - .unwrap_or(false); - - let has_debugger_address = matched - .remove("moz:debuggerAddress") - .and_then(|x| x.as_bool()) - .unwrap_or(false); - - // Set a command line provided port for the Remote Agent for now. - // It needs to be the same on the host and the Android device. - if has_web_socket_url || has_debugger_address { - rv.use_websocket = true; - - // Bug 1722863: Setting of command line arguments would be - // better suited in the individual Browser implementations. - let mut remote_args = Vec::new(); - remote_args.push("--remote-debugging-port".to_owned()); - remote_args.push(settings.websocket_port.to_string()); - - // Handle additional hosts for WebDriver BiDi WebSocket connections - if !settings.allow_hosts.is_empty() { - remote_args.push("--remote-allow-hosts".to_owned()); - remote_args.push( - settings - .allow_hosts - .iter() - .map(|host| host.to_string()) - .collect::>() - .join(","), - ); - } - - // Handle additional origins for WebDriver BiDi WebSocket connections - if !settings.allow_origins.is_empty() { - remote_args.push("--remote-allow-origins".to_owned()); - remote_args.push( - settings - .allow_origins - .iter() - .map(|origin| origin.to_string()) - .collect::>() - .join(","), - ); - } - - if let Some(ref mut args) = rv.args { - args.append(&mut remote_args); - } else { - rv.args = Some(remote_args); - } - } - - Ok(rv) - } - - fn load_profile( - profile_root: Option<&Path>, - options: &Capabilities, - ) -> WebDriverResult> { - if let Some(profile_json) = options.get("profile") { - let profile_base64 = profile_json.as_str().ok_or_else(|| { - WebDriverError::new(ErrorStatus::InvalidArgument, "Profile is not a string") - })?; - let profile_zip = &*base64::decode(profile_base64)?; - - // Create an emtpy profile directory - let profile = Profile::new(profile_root)?; - unzip_buffer( - profile_zip, - profile - .temp_dir - .as_ref() - .expect("Profile doesn't have a path") - .path(), - )?; - - Ok(Some(profile)) - } else { - Ok(None) - } - } - - fn load_args(options: &Capabilities) -> WebDriverResult>> { - if let Some(args_json) = options.get("args") { - let args_array = args_json.as_array().ok_or_else(|| { - WebDriverError::new(ErrorStatus::InvalidArgument, "Arguments were not an array") - })?; - let args = args_array - .iter() - .map(|x| x.as_str().map(|x| x.to_owned())) - .collect::>>() - .ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "Arguments entries were not all strings", - ) - })?; - - Ok(Some(args)) - } else { - Ok(None) - } - } - - pub fn load_env(options: &Capabilities) -> WebDriverResult>> { - if let Some(env_data) = options.get("env") { - let env = env_data.as_object().ok_or_else(|| { - WebDriverError::new(ErrorStatus::InvalidArgument, "Env was not an object") - })?; - let mut rv = Vec::with_capacity(env.len()); - for (key, value) in env.iter() { - rv.push(( - key.clone(), - value - .as_str() - .ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "Env value is not a string", - ) - })? - .to_string(), - )); - } - Ok(Some(rv)) - } else { - Ok(None) - } - } - - fn load_log(options: &Capabilities) -> WebDriverResult { - if let Some(json) = options.get("log") { - let log = json.as_object().ok_or_else(|| { - WebDriverError::new(ErrorStatus::InvalidArgument, "Log section is not an object") - })?; - - let level = match log.get("level") { - Some(json) => { - let s = json.as_str().ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "Log level is not a string", - ) - })?; - Some(Level::from_str(s).ok().ok_or_else(|| { - WebDriverError::new(ErrorStatus::InvalidArgument, "Log level is unknown") - })?) - } - None => None, - }; - - Ok(LogOptions { level }) - } else { - Ok(Default::default()) - } - } - - pub fn load_prefs(options: &Capabilities) -> WebDriverResult> { - if let Some(prefs_data) = options.get("prefs") { - let prefs = prefs_data.as_object().ok_or_else(|| { - WebDriverError::new(ErrorStatus::InvalidArgument, "Prefs were not an object") - })?; - let mut rv = Vec::with_capacity(prefs.len()); - for (key, value) in prefs.iter() { - rv.push((key.clone(), pref_from_json(value)?)); - } - Ok(rv) - } else { - Ok(vec![]) - } - } - - pub fn load_android( - storage: AndroidStorageInput, - options: &Capabilities, - ) -> WebDriverResult> { - if let Some(package_json) = options.get("androidPackage") { - let package = package_json - .as_str() - .ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "androidPackage is not a string", - ) - })? - .to_owned(); - - // https://developer.android.com/studio/build/application-id - let package_regexp = - Regex::new(r#"^([a-zA-Z][a-zA-Z0-9_]*\.){1,}([a-zA-Z][a-zA-Z0-9_]*)$"#).unwrap(); - if !package_regexp.is_match(package.as_bytes()) { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "Not a valid androidPackage name", - )); - } - - let mut android = AndroidOptions::new(package.clone(), storage); - - android.activity = match options.get("androidActivity") { - Some(json) => { - let activity = json - .as_str() - .ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "androidActivity is not a string", - ) - })? - .to_owned(); - - if activity.contains('/') { - return Err(WebDriverError::new( - ErrorStatus::InvalidArgument, - "androidActivity should not contain '/", - )); - } - - Some(activity) - } - None => { - match package.as_str() { - "org.mozilla.firefox" - | "org.mozilla.firefox_beta" - | "org.mozilla.fenix" - | "org.mozilla.fenix.debug" - | "org.mozilla.reference.browser" => { - Some("org.mozilla.fenix.IntentReceiverActivity".to_string()) - } - "org.mozilla.focus" - | "org.mozilla.focus.debug" - | "org.mozilla.klar" - | "org.mozilla.klar.debug" => { - Some("org.mozilla.focus.activity.IntentReceiverActivity".to_string()) - } - // For all other applications fallback to auto-detection. - _ => None, - } - } - }; - - android.device_serial = match options.get("androidDeviceSerial") { - Some(json) => Some( - json.as_str() - .ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "androidDeviceSerial is not a string", - ) - })? - .to_owned(), - ), - None => None, - }; - - android.intent_arguments = match options.get("androidIntentArguments") { - Some(json) => { - let args_array = json.as_array().ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "androidIntentArguments is not an array", - ) - })?; - let args = args_array - .iter() - .map(|x| x.as_str().map(|x| x.to_owned())) - .collect::>>() - .ok_or_else(|| { - WebDriverError::new( - ErrorStatus::InvalidArgument, - "androidIntentArguments entries are not all strings", - ) - })?; - - Some(args) - } - None => { - // All GeckoView based applications support this view, - // and allow to open a blank page in a Gecko window. - Some(vec![ - "-a".to_string(), - "android.intent.action.VIEW".to_string(), - "-d".to_string(), - "about:blank".to_string(), - ]) - } - }; - - Ok(Some(android)) - } else { - Ok(None) - } - } -} - -fn pref_from_json(value: &Value) -> WebDriverResult { - match *value { - Value::String(ref x) => Ok(Pref::new(x.clone())), - Value::Number(ref x) => Ok(Pref::new(x.as_i64().unwrap())), - Value::Bool(x) => Ok(Pref::new(x)), - _ => Err(WebDriverError::new( - ErrorStatus::UnknownError, - "Could not convert pref value to string, boolean, or integer", - )), - } -} - -fn unzip_buffer(buf: &[u8], dest_dir: &Path) -> WebDriverResult<()> { - let reader = Cursor::new(buf); - let mut zip = zip::ZipArchive::new(reader) - .map_err(|_| WebDriverError::new(ErrorStatus::UnknownError, "Failed to unzip profile"))?; - - for i in 0..zip.len() { - let mut file = zip.by_index(i).map_err(|_| { - WebDriverError::new( - ErrorStatus::UnknownError, - "Processing profile zip file failed", - ) - })?; - let unzip_path = { - let name = file.name(); - let is_dir = name.ends_with('/'); - let rel_path = Path::new(name); - let dest_path = dest_dir.join(rel_path); - - { - let create_dir = if is_dir { - Some(dest_path.as_path()) - } else { - dest_path.parent() - }; - if let Some(dir) = create_dir { - if !dir.exists() { - debug!("Creating profile directory tree {}", dir.to_string_lossy()); - fs::create_dir_all(dir)?; - } - } - } - - if is_dir { - None - } else { - Some(dest_path) - } - }; - - if let Some(unzip_path) = unzip_path { - debug!("Extracting profile to {}", unzip_path.to_string_lossy()); - let dest = fs::File::create(unzip_path)?; - if file.size() > 0 { - let mut writer = BufWriter::new(dest); - io::copy(&mut file, &mut writer)?; - } - } - } - - Ok(()) -} - -#[cfg(test)] -mod tests { - extern crate mozprofile; - - use self::mozprofile::preferences::Pref; - use super::*; - use serde_json::{json, Map, Value}; - use std::fs::File; - use std::io::Read; - use url::{Host, Url}; - use webdriver::capabilities::Capabilities; - - fn example_profile() -> Value { - let mut profile_data = Vec::with_capacity(1024); - let mut profile = File::open("src/tests/profile.zip").unwrap(); - profile.read_to_end(&mut profile_data).unwrap(); - Value::String(base64::encode(&profile_data)) - } - - fn make_options( - firefox_opts: Capabilities, - marionette_settings: Option, - ) -> WebDriverResult { - let mut caps = Capabilities::new(); - caps.insert("moz:firefoxOptions".into(), Value::Object(firefox_opts)); - - FirefoxOptions::from_capabilities(None, &marionette_settings.unwrap_or_default(), &mut caps) - } - - #[test] - fn fx_options_default() { - let opts: FirefoxOptions = Default::default(); - assert_eq!(opts.android, None); - assert_eq!(opts.args, None); - assert_eq!(opts.binary, None); - assert_eq!(opts.log, LogOptions { level: None }); - assert_eq!(opts.prefs, vec![]); - // Profile doesn't support PartialEq - // assert_eq!(opts.profile, None); - } - - #[test] - fn fx_options_from_capabilities_no_binary_and_empty_caps() { - let mut caps = Capabilities::new(); - - let marionette_settings = Default::default(); - let opts = FirefoxOptions::from_capabilities(None, &marionette_settings, &mut caps) - .expect("valid firefox options"); - assert_eq!(opts.android, None); - assert_eq!(opts.args, None); - assert_eq!(opts.binary, None); - assert_eq!(opts.log, LogOptions { level: None }); - assert_eq!(opts.prefs, vec![]); - } - - #[test] - fn fx_options_from_capabilities_with_binary_and_caps() { - let mut caps = Capabilities::new(); - caps.insert( - "moz:firefoxOptions".into(), - Value::Object(Capabilities::new()), - ); - - let binary = PathBuf::from("foo"); - let marionette_settings = Default::default(); - - let opts = FirefoxOptions::from_capabilities( - Some(binary.clone()), - &marionette_settings, - &mut caps, - ) - .expect("valid firefox options"); - assert_eq!(opts.android, None); - assert_eq!(opts.args, None); - assert_eq!(opts.binary, Some(binary)); - assert_eq!(opts.log, LogOptions { level: None }); - assert_eq!(opts.prefs, vec![]); - } - - #[test] - fn fx_options_from_capabilities_with_blocked_firefox_arguments() { - let blocked_args = vec![ - "--marionette", - "--remote-allow-hosts", - "--remote-allow-origins", - "--remote-debugging-port", - ]; - - for arg in blocked_args { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("args".into(), json!([arg])); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - } - - #[test] - fn fx_options_from_capabilities_with_websocket_url_not_set() { - let mut caps = Capabilities::new(); - - let marionette_settings = Default::default(); - let opts = FirefoxOptions::from_capabilities(None, &marionette_settings, &mut caps) - .expect("Valid Firefox options"); - - assert!( - opts.args.is_none(), - "CLI arguments for Firefox unexpectedly found" - ); - } - - #[test] - fn fx_options_from_capabilities_with_websocket_url_false() { - let mut caps = Capabilities::new(); - caps.insert("webSocketUrl".into(), json!(false)); - - let marionette_settings = Default::default(); - let opts = FirefoxOptions::from_capabilities(None, &marionette_settings, &mut caps) - .expect("Valid Firefox options"); - - assert!( - opts.args.is_none(), - "CLI arguments for Firefox unexpectedly found" - ); - } - - #[test] - fn fx_options_from_capabilities_with_websocket_url_true() { - let mut caps = Capabilities::new(); - caps.insert("webSocketUrl".into(), json!(true)); - - let settings = MarionetteSettings { - websocket_port: 1234, - ..Default::default() - }; - let opts = FirefoxOptions::from_capabilities(None, &settings, &mut caps) - .expect("Valid Firefox options"); - - if let Some(args) = opts.args { - let mut iter = args.iter(); - assert!(iter.any(|arg| arg == &"--remote-debugging-port".to_owned())); - assert_eq!(iter.next(), Some(&"1234".to_owned())); - } else { - panic!("CLI arguments for Firefox not found"); - } - } - - #[test] - fn fx_options_from_capabilities_with_websocket_and_allow_hosts() { - let mut caps = Capabilities::new(); - caps.insert("webSocketUrl".into(), json!(true)); - - let mut marionette_settings: MarionetteSettings = Default::default(); - marionette_settings.allow_hosts = vec![ - Host::parse("foo").expect("host"), - Host::parse("bar").expect("host"), - ]; - let opts = FirefoxOptions::from_capabilities(None, &marionette_settings, &mut caps) - .expect("Valid Firefox options"); - - if let Some(args) = opts.args { - let mut iter = args.iter(); - assert!(iter.any(|arg| arg == &"--remote-allow-hosts".to_owned())); - assert_eq!(iter.next(), Some(&"foo,bar".to_owned())); - assert!(!iter.any(|arg| arg == &"--remote-allow-origins".to_owned())); - } else { - panic!("CLI arguments for Firefox not found"); - } - } - - #[test] - fn fx_options_from_capabilities_with_websocket_and_allow_origins() { - let mut caps = Capabilities::new(); - caps.insert("webSocketUrl".into(), json!(true)); - - let mut marionette_settings: MarionetteSettings = Default::default(); - marionette_settings.allow_origins = vec![ - Url::parse("http://foo/").expect("url"), - Url::parse("http://bar/").expect("url"), - ]; - let opts = FirefoxOptions::from_capabilities(None, &marionette_settings, &mut caps) - .expect("Valid Firefox options"); - - if let Some(args) = opts.args { - let mut iter = args.iter(); - assert!(iter.any(|arg| arg == &"--remote-allow-origins".to_owned())); - assert_eq!(iter.next(), Some(&"http://foo/,http://bar/".to_owned())); - assert!(!iter.any(|arg| arg == &"--remote-allow-hosts".to_owned())); - } else { - panic!("CLI arguments for Firefox not found"); - } - } - - #[test] - fn fx_options_from_capabilities_with_debugger_address_not_set() { - let caps = Capabilities::new(); - - let opts = make_options(caps, None).expect("valid firefox options"); - assert!( - opts.args.is_none(), - "CLI arguments for Firefox unexpectedly found" - ); - } - - #[test] - fn fx_options_from_capabilities_with_debugger_address_false() { - let mut caps = Capabilities::new(); - caps.insert("moz:debuggerAddress".into(), json!(false)); - - let opts = make_options(caps, None).expect("valid firefox options"); - assert!( - opts.args.is_none(), - "CLI arguments for Firefox unexpectedly found" - ); - } - - #[test] - fn fx_options_from_capabilities_with_debugger_address_true() { - let mut caps = Capabilities::new(); - caps.insert("moz:debuggerAddress".into(), json!(true)); - - let settings = MarionetteSettings { - websocket_port: 1234, - ..Default::default() - }; - let opts = FirefoxOptions::from_capabilities(None, &settings, &mut caps) - .expect("Valid Firefox options"); - - if let Some(args) = opts.args { - let mut iter = args.iter(); - assert!(iter.any(|arg| arg == &"--remote-debugging-port".to_owned())); - assert_eq!(iter.next(), Some(&"1234".to_owned())); - } else { - panic!("CLI arguments for Firefox not found"); - } - } - - #[test] - fn fx_options_from_capabilities_with_invalid_caps() { - let mut caps = Capabilities::new(); - caps.insert("moz:firefoxOptions".into(), json!(42)); - - let marionette_settings = Default::default(); - FirefoxOptions::from_capabilities(None, &marionette_settings, &mut caps) - .expect_err("Firefox options need to be of type object"); - } - - #[test] - fn fx_options_android_package_and_binary() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo")); - firefox_opts.insert("binary".into(), json!("bar")); - - make_options(firefox_opts, None) - .expect_err("androidPackage and binary are mutual exclusive"); - } - - #[test] - fn fx_options_android_no_package() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidAvtivity".into(), json!("foo")); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!(opts.android, None); - } - - #[test] - fn fx_options_android_package_valid_value() { - for value in ["foo.bar", "foo.bar.cheese.is.good", "Foo.Bar_9"].iter() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!(value)); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!(opts.android.unwrap().package, value.to_string()); - } - } - - #[test] - fn fx_options_android_package_invalid_type() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!(42)); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn fx_options_android_package_invalid_value() { - for value in ["../foo", "\\foo\n", "foo", "_foo", "0foo"].iter() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!(value)); - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - } - - #[test] - fn fx_options_android_activity_default_known_apps() { - let packages = vec![ - "org.mozilla.firefox", - "org.mozilla.firefox_beta", - "org.mozilla.fenix", - "org.mozilla.fenix.debug", - "org.mozilla.focus", - "org.mozilla.focus.debug", - "org.mozilla.klar", - "org.mozilla.klar.debug", - "org.mozilla.reference.browser", - ]; - - for package in packages { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!(package)); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert!(opts - .android - .unwrap() - .activity - .unwrap() - .contains("IntentReceiverActivity")); - } - } - - #[test] - fn fx_options_android_activity_default_unknown_apps() { - let packages = vec!["org.mozilla.geckoview_example", "com.some.other.app"]; - - for package in packages { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!(package)); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!(opts.android.unwrap().activity, None); - } - - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert( - "androidPackage".into(), - json!("org.mozilla.geckoview_example"), - ); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!(opts.android.unwrap().activity, None); - } - - #[test] - fn fx_options_android_activity_override() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidActivity".into(), json!("foo")); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!(opts.android.unwrap().activity, Some("foo".to_string())); - } - - #[test] - fn fx_options_android_activity_invalid_type() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidActivity".into(), json!(42)); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn fx_options_android_activity_invalid_value() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidActivity".into(), json!("foo.bar/cheese")); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn fx_options_android_device_serial() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidDeviceSerial".into(), json!("cheese")); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!( - opts.android.unwrap().device_serial, - Some("cheese".to_string()) - ); - } - - #[test] - fn fx_options_android_device_serial_invalid() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidDeviceSerial".into(), json!(42)); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn fx_options_android_intent_arguments_defaults() { - let packages = vec![ - "org.mozilla.firefox", - "org.mozilla.firefox_beta", - "org.mozilla.fenix", - "org.mozilla.fenix.debug", - "org.mozilla.geckoview_example", - "org.mozilla.reference.browser", - "com.some.other.app", - ]; - - for package in packages { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!(package)); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!( - opts.android.unwrap().intent_arguments, - Some(vec![ - "-a".to_string(), - "android.intent.action.VIEW".to_string(), - "-d".to_string(), - "about:blank".to_string(), - ]) - ); - } - } - - #[test] - fn fx_options_android_intent_arguments_override() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidIntentArguments".into(), json!(["lorem", "ipsum"])); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - assert_eq!( - opts.android.unwrap().intent_arguments, - Some(vec!["lorem".to_string(), "ipsum".to_string()]) - ); - } - - #[test] - fn fx_options_android_intent_arguments_no_array() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidIntentArguments".into(), json!(42)); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn fx_options_android_intent_arguments_invalid_value() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("androidPackage".into(), json!("foo.bar")); - firefox_opts.insert("androidIntentArguments".into(), json!(["lorem", 42])); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn fx_options_env() { - let mut env: Map = Map::new(); - env.insert("TEST_KEY_A".into(), Value::String("test_value_a".into())); - env.insert("TEST_KEY_B".into(), Value::String("test_value_b".into())); - - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("env".into(), env.into()); - - let mut opts = make_options(firefox_opts, None).expect("valid firefox options"); - for sorted in opts.env.iter_mut() { - sorted.sort() - } - assert_eq!( - opts.env, - Some(vec![ - ("TEST_KEY_A".into(), "test_value_a".into()), - ("TEST_KEY_B".into(), "test_value_b".into()), - ]) - ); - } - - #[test] - fn fx_options_env_invalid_container() { - let env = Value::Number(1.into()); - - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("env".into(), env); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn fx_options_env_invalid_value() { - let mut env: Map = Map::new(); - env.insert("TEST_KEY".into(), Value::Number(1.into())); - - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("env".into(), env.into()); - - make_options(firefox_opts, None).expect_err("invalid firefox options"); - } - - #[test] - fn test_profile() { - let encoded_profile = example_profile(); - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("profile".into(), encoded_profile); - - let opts = make_options(firefox_opts, None).expect("valid firefox options"); - let mut profile = match opts.profile { - ProfileType::Path(profile) => profile, - _ => panic!("Expected ProfileType::Path"), - }; - let prefs = profile.user_prefs().expect("valid preferences"); - - println!("{:#?}", prefs.prefs); - - assert_eq!( - prefs.get("startup.homepage_welcome_url"), - Some(&Pref::new("data:text/html,PASS")) - ); - } - - #[test] - fn fx_options_args_profile() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("args".into(), json!(["--profile", "foo"])); - - let options = make_options(firefox_opts, None).expect("Valid args"); - assert!(matches!(options.profile, ProfileType::Path(_))); - } - - #[test] - fn fx_options_args_named_profile() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("args".into(), json!(["-P", "foo"])); - - let options = make_options(firefox_opts, None).expect("Valid args"); - assert!(matches!(options.profile, ProfileType::Named)); - } - - #[test] - fn fx_options_args_no_profile() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("args".into(), json!(["--headless"])); - - let options = make_options(firefox_opts, None).expect("Valid args"); - assert!(matches!(options.profile, ProfileType::Temporary)); - } - - #[test] - fn fx_options_args_profile_and_profile() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("args".into(), json!(["--profile", "foo"])); - firefox_opts.insert("profile".into(), json!("foo")); - - make_options(firefox_opts, None).expect_err("Invalid args"); - } - - #[test] - fn fx_options_args_p_and_profile() { - let mut firefox_opts = Capabilities::new(); - firefox_opts.insert("args".into(), json!(["-P"])); - firefox_opts.insert("profile".into(), json!("foo")); - - make_options(firefox_opts, None).expect_err("Invalid args"); - } -} diff --git a/python/drivers/geckodriver-0.33.0/src/command.rs b/python/drivers/geckodriver-0.33.0/src/command.rs deleted file mode 100644 index 798a4c0..0000000 --- a/python/drivers/geckodriver-0.33.0/src/command.rs +++ /dev/null @@ -1,339 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use crate::logging; -use hyper::Method; -use serde::de::{self, Deserialize, Deserializer}; -use serde_json::{self, Value}; -use std::env; -use std::fs::File; -use std::io::prelude::*; -use uuid::Uuid; -use webdriver::command::{WebDriverCommand, WebDriverExtensionCommand}; -use webdriver::error::WebDriverResult; -use webdriver::httpapi::WebDriverExtensionRoute; -use webdriver::Parameters; - -pub fn extension_routes() -> Vec<(Method, &'static str, GeckoExtensionRoute)> { - vec![ - ( - Method::GET, - "/session/{sessionId}/moz/context", - GeckoExtensionRoute::GetContext, - ), - ( - Method::POST, - "/session/{sessionId}/moz/context", - GeckoExtensionRoute::SetContext, - ), - ( - Method::POST, - "/session/{sessionId}/moz/addon/install", - GeckoExtensionRoute::InstallAddon, - ), - ( - Method::POST, - "/session/{sessionId}/moz/addon/uninstall", - GeckoExtensionRoute::UninstallAddon, - ), - ( - Method::GET, - "/session/{sessionId}/moz/screenshot/full", - GeckoExtensionRoute::TakeFullScreenshot, - ), - ] -} - -#[derive(Clone, PartialEq, Eq)] -pub enum GeckoExtensionRoute { - GetContext, - SetContext, - InstallAddon, - UninstallAddon, - TakeFullScreenshot, -} - -impl WebDriverExtensionRoute for GeckoExtensionRoute { - type Command = GeckoExtensionCommand; - - fn command( - &self, - _params: &Parameters, - body_data: &Value, - ) -> WebDriverResult> { - use self::GeckoExtensionRoute::*; - - let command = match *self { - GetContext => GeckoExtensionCommand::GetContext, - SetContext => { - GeckoExtensionCommand::SetContext(serde_json::from_value(body_data.clone())?) - } - InstallAddon => { - GeckoExtensionCommand::InstallAddon(serde_json::from_value(body_data.clone())?) - } - UninstallAddon => { - GeckoExtensionCommand::UninstallAddon(serde_json::from_value(body_data.clone())?) - } - TakeFullScreenshot => GeckoExtensionCommand::TakeFullScreenshot, - }; - - Ok(WebDriverCommand::Extension(command)) - } -} - -#[derive(Clone)] -pub enum GeckoExtensionCommand { - GetContext, - SetContext(GeckoContextParameters), - InstallAddon(AddonInstallParameters), - UninstallAddon(AddonUninstallParameters), - TakeFullScreenshot, -} - -impl WebDriverExtensionCommand for GeckoExtensionCommand { - fn parameters_json(&self) -> Option { - use self::GeckoExtensionCommand::*; - match self { - GetContext => None, - InstallAddon(x) => Some(serde_json::to_value(x).unwrap()), - SetContext(x) => Some(serde_json::to_value(x).unwrap()), - UninstallAddon(x) => Some(serde_json::to_value(x).unwrap()), - TakeFullScreenshot => None, - } - } -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize)] -pub struct AddonInstallParameters { - pub path: String, - pub temporary: Option, -} - -impl<'de> Deserialize<'de> for AddonInstallParameters { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Debug, Deserialize)] - #[serde(deny_unknown_fields)] - struct Base64 { - addon: String, - temporary: Option, - } - - #[derive(Debug, Deserialize)] - #[serde(deny_unknown_fields)] - struct Path { - path: String, - temporary: Option, - } - - #[derive(Debug, Deserialize)] - #[serde(untagged)] - enum Helper { - Base64(Base64), - Path(Path), - } - - let params = match Helper::deserialize(deserializer)? { - Helper::Path(ref mut data) => AddonInstallParameters { - path: data.path.clone(), - temporary: data.temporary, - }, - Helper::Base64(ref mut data) => { - let content = base64::decode(&data.addon).map_err(de::Error::custom)?; - - let path = env::temp_dir() - .as_path() - .join(format!("addon-{}.xpi", Uuid::new_v4())); - let mut xpi_file = File::create(&path).map_err(de::Error::custom)?; - xpi_file - .write(content.as_slice()) - .map_err(de::Error::custom)?; - - let path = match path.to_str() { - Some(path) => path.to_string(), - None => return Err(de::Error::custom("could not write addon to file")), - }; - - AddonInstallParameters { - path, - temporary: data.temporary, - } - } - }; - - Ok(params) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct AddonUninstallParameters { - pub id: String, -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum GeckoContext { - Content, - Chrome, -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct GeckoContextParameters { - pub context: GeckoContext, -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub struct XblLocatorParameters { - pub name: String, - pub value: String, -} - -#[derive(Default, Debug, PartialEq, Eq)] -pub struct LogOptions { - pub level: Option, -} - -#[cfg(test)] -mod tests { - use serde_json::json; - - use super::*; - use crate::test::assert_de; - - #[test] - fn test_json_addon_install_parameters_invalid() { - assert!(serde_json::from_str::("").is_err()); - assert!(serde_json::from_value::(json!(null)).is_err()); - assert!(serde_json::from_value::(json!({})).is_err()); - } - - #[test] - fn test_json_addon_install_parameters_with_path_and_temporary() { - let params = AddonInstallParameters { - path: "/path/to.xpi".to_string(), - temporary: Some(true), - }; - assert_de(¶ms, json!({"path": "/path/to.xpi", "temporary": true})); - } - - #[test] - fn test_json_addon_install_parameters_with_path() { - let params = AddonInstallParameters { - path: "/path/to.xpi".to_string(), - temporary: None, - }; - assert_de(¶ms, json!({"path": "/path/to.xpi"})); - } - - #[test] - fn test_json_addon_install_parameters_with_path_invalid_type() { - let json = json!({"path": true, "temporary": true}); - assert!(serde_json::from_value::(json).is_err()); - } - - #[test] - fn test_json_addon_install_parameters_with_path_and_temporary_invalid_type() { - let json = json!({"path": "/path/to.xpi", "temporary": "foo"}); - assert!(serde_json::from_value::(json).is_err()); - } - - #[test] - fn test_json_addon_install_parameters_with_addon() { - let json = json!({"addon": "aGVsbG8=", "temporary": true}); - let data = serde_json::from_value::(json).unwrap(); - - assert_eq!(data.temporary, Some(true)); - let mut file = File::open(data.path).unwrap(); - let mut contents = String::new(); - file.read_to_string(&mut contents).unwrap(); - assert_eq!(contents, "hello"); - } - - #[test] - fn test_json_addon_install_parameters_with_addon_only() { - let json = json!({"addon": "aGVsbG8="}); - let data = serde_json::from_value::(json).unwrap(); - - assert_eq!(data.temporary, None); - let mut file = File::open(data.path).unwrap(); - let mut contents = String::new(); - file.read_to_string(&mut contents).unwrap(); - assert_eq!(contents, "hello"); - } - - #[test] - fn test_json_addon_install_parameters_with_addon_invalid_type() { - let json = json!({"addon": true, "temporary": true}); - assert!(serde_json::from_value::(json).is_err()); - } - - #[test] - fn test_json_addon_install_parameters_with_addon_and_temporary_invalid_type() { - let json = json!({"addon": "aGVsbG8=", "temporary": "foo"}); - assert!(serde_json::from_value::(json).is_err()); - } - - #[test] - fn test_json_install_parameters_with_temporary_only() { - let json = json!({"temporary": true}); - assert!(serde_json::from_value::(json).is_err()); - } - - #[test] - fn test_json_addon_install_parameters_with_both_path_and_addon() { - let json = json!({ - "path": "/path/to.xpi", - "addon": "aGVsbG8=", - "temporary": true, - }); - assert!(serde_json::from_value::(json).is_err()); - } - - #[test] - fn test_json_addon_uninstall_parameters_invalid() { - assert!(serde_json::from_str::("").is_err()); - assert!(serde_json::from_value::(json!(null)).is_err()); - assert!(serde_json::from_value::(json!({})).is_err()); - } - - #[test] - fn test_json_addon_uninstall_parameters() { - let params = AddonUninstallParameters { - id: "foo".to_string(), - }; - assert_de(¶ms, json!({"id": "foo"})); - } - - #[test] - fn test_json_addon_uninstall_parameters_id_invalid_type() { - let json = json!({"id": true}); - assert!(serde_json::from_value::(json).is_err()); - } - - #[test] - fn test_json_gecko_context_parameters_content() { - let params = GeckoContextParameters { - context: GeckoContext::Content, - }; - assert_de(¶ms, json!({"context": "content"})); - } - - #[test] - fn test_json_gecko_context_parameters_chrome() { - let params = GeckoContextParameters { - context: GeckoContext::Chrome, - }; - assert_de(¶ms, json!({"context": "chrome"})); - } - - #[test] - fn test_json_gecko_context_parameters_context_invalid() { - type P = GeckoContextParameters; - assert!(serde_json::from_value::

(json!({})).is_err()); - assert!(serde_json::from_value::

(json!({ "context": null })).is_err()); - assert!(serde_json::from_value::

(json!({"context": "foo"})).is_err()); - } -} diff --git a/python/drivers/geckodriver-0.33.0/src/logging.rs b/python/drivers/geckodriver-0.33.0/src/logging.rs deleted file mode 100644 index 073da95..0000000 --- a/python/drivers/geckodriver-0.33.0/src/logging.rs +++ /dev/null @@ -1,403 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//! Gecko-esque logger implementation for the [`log`] crate. -//! -//! The [`log`] crate provides a single logging API that abstracts over the -//! actual logging implementation. This module uses the logging API -//! to provide a log implementation that shares many aesthetical traits with -//! [Log.sys.mjs] from Gecko. -//! -//! Using the [`error!`], [`warn!`], [`info!`], [`debug!`], and -//! [`trace!`] macros from `log` will output a timestamp field, followed by the -//! log level, and then the message. The fields are separated by a tab -//! character, making the output suitable for further text processing with -//! `awk(1)`. -//! -//! This module shares the same API as `log`, except it provides additional -//! entry functions [`init`] and [`init_with_level`] and additional log levels -//! `Level::Fatal` and `Level::Config`. Converting these into the -//! [`log::Level`] is lossy so that `Level::Fatal` becomes `log::Level::Error` -//! and `Level::Config` becomes `log::Level::Debug`. -//! -//! [`log`]: https://docs.rs/log/newest/log/ -//! [Log.sys.mjs]: https://searchfox.org/mozilla-central/source/toolkit/modules/Log.sys.mjs -//! [`error!`]: https://docs.rs/log/newest/log/macro.error.html -//! [`warn!`]: https://docs.rs/log/newest/log/macro.warn.html -//! [`info!`]: https://docs.rs/log/newest/log/macro.info.html -//! [`debug!`]: https://docs.rs/log/newest/log/macro.debug.html -//! [`trace!`]: https://docs.rs/log/newest/log/macro.trace.html -//! [`init`]: fn.init.html -//! [`init_with_level`]: fn.init_with_level.html - -use std::fmt; -use std::io; -use std::io::Write; -use std::str; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use unicode_segmentation::UnicodeSegmentation; - -use mozprofile::preferences::Pref; - -static LOG_TRUNCATE: AtomicBool = AtomicBool::new(true); -static MAX_LOG_LEVEL: AtomicUsize = AtomicUsize::new(0); - -const MAX_STRING_LENGTH: usize = 250; - -const LOGGED_TARGETS: &[&str] = &[ - "geckodriver", - "mozdevice", - "mozprofile", - "mozrunner", - "mozversion", - "webdriver", -]; - -/// Logger levels from [Log.sys.mjs]. -/// -/// [Log.sys.mjs]: https://searchfox.org/mozilla-central/source/toolkit/modules/Log.sys.mjs -#[repr(usize)] -#[derive(Clone, Copy, Eq, Debug, Hash, PartialEq)] -pub enum Level { - Fatal = 70, - Error = 60, - Warn = 50, - Info = 40, - Config = 30, - Debug = 20, - Trace = 10, -} - -impl From for Level { - fn from(n: usize) -> Level { - use self::Level::*; - match n { - 70 => Fatal, - 60 => Error, - 50 => Warn, - 40 => Info, - 30 => Config, - 20 => Debug, - 10 => Trace, - _ => Info, - } - } -} - -impl fmt::Display for Level { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use self::Level::*; - let s = match *self { - Fatal => "FATAL", - Error => "ERROR", - Warn => "WARN", - Info => "INFO", - Config => "CONFIG", - Debug => "DEBUG", - Trace => "TRACE", - }; - write!(f, "{}", s) - } -} - -impl str::FromStr for Level { - type Err = (); - - fn from_str(s: &str) -> Result { - use self::Level::*; - match s.to_lowercase().as_ref() { - "fatal" => Ok(Fatal), - "error" => Ok(Error), - "warn" => Ok(Warn), - "info" => Ok(Info), - "config" => Ok(Config), - "debug" => Ok(Debug), - "trace" => Ok(Trace), - _ => Err(()), - } - } -} - -impl From for log::Level { - fn from(level: Level) -> log::Level { - use self::Level::*; - match level { - Fatal | Error => log::Level::Error, - Warn => log::Level::Warn, - Info => log::Level::Info, - Config | Debug => log::Level::Debug, - Trace => log::Level::Trace, - } - } -} - -impl From for Pref { - fn from(level: Level) -> Pref { - use self::Level::*; - Pref::new(match level { - Fatal => "Fatal", - Error => "Error", - Warn => "Warn", - Info => "Info", - Config => "Config", - Debug => "Debug", - Trace => "Trace", - }) - } -} - -impl From for Level { - fn from(log_level: log::Level) -> Level { - use log::Level::*; - match log_level { - Error => Level::Error, - Warn => Level::Warn, - Info => Level::Info, - Debug => Level::Debug, - Trace => Level::Trace, - } - } -} - -struct Logger; - -impl log::Log for Logger { - fn enabled(&self, meta: &log::Metadata) -> bool { - LOGGED_TARGETS.iter().any(|&x| meta.target().starts_with(x)) - && meta.level() <= log::max_level() - } - - fn log(&self, record: &log::Record) { - if self.enabled(record.metadata()) { - if let Some((s1, s2)) = truncate_message(record.args()) { - println!( - "{}\t{}\t{}\t{} ... {}", - format_ts(chrono::Local::now()), - record.target(), - record.level(), - s1, - s2 - ); - } else { - println!( - "{}\t{}\t{}\t{}", - format_ts(chrono::Local::now()), - record.target(), - record.level(), - record.args() - ) - } - } - } - - fn flush(&self) { - io::stdout().flush().unwrap(); - } -} - -/// Initialises the logging subsystem with the default log level. -pub fn init(truncate: bool) -> Result<(), log::SetLoggerError> { - init_with_level(Level::Info, truncate) -} - -/// Initialises the logging subsystem. -pub fn init_with_level(level: Level, truncate: bool) -> Result<(), log::SetLoggerError> { - let logger = Logger {}; - set_max_level(level); - set_truncate(truncate); - log::set_boxed_logger(Box::new(logger))?; - Ok(()) -} - -/// Returns the current maximum log level. -pub fn max_level() -> Level { - MAX_LOG_LEVEL.load(Ordering::Relaxed).into() -} - -/// Sets the global maximum log level. -pub fn set_max_level(level: Level) { - MAX_LOG_LEVEL.store(level as usize, Ordering::SeqCst); - - let slevel: log::Level = level.into(); - log::set_max_level(slevel.to_level_filter()) -} - -/// Sets the global maximum log level. -pub fn set_truncate(truncate: bool) { - LOG_TRUNCATE.store(truncate, Ordering::SeqCst); -} - -/// Returns the truncation flag. -pub fn truncate() -> bool { - LOG_TRUNCATE.load(Ordering::Relaxed) -} - -/// Produces a 13-digit Unix Epoch timestamp similar to Gecko. -fn format_ts(ts: chrono::DateTime) -> String { - format!("{}{:03}", ts.timestamp(), ts.timestamp_subsec_millis()) -} - -/// Truncate a log message if it's too long -fn truncate_message(args: &fmt::Arguments) -> Option<(String, String)> { - // Don't truncate the message if requested. - if !truncate() { - return None; - } - - let message = format!("{}", args); - let chars = message.graphemes(true).collect::>(); - - if chars.len() > MAX_STRING_LENGTH { - let middle: usize = MAX_STRING_LENGTH / 2; - let s1 = chars[0..middle].concat(); - let s2 = chars[chars.len() - middle..].concat(); - Some((s1, s2)) - } else { - None - } -} - -#[cfg(test)] -mod tests { - use super::*; - - use std::str::FromStr; - use std::sync::Mutex; - - use mozprofile::preferences::{Pref, PrefValue}; - - lazy_static! { - static ref LEVEL_MUTEX: Mutex<()> = Mutex::new(()); - } - - #[test] - fn test_level_repr() { - assert_eq!(Level::Fatal as usize, 70); - assert_eq!(Level::Error as usize, 60); - assert_eq!(Level::Warn as usize, 50); - assert_eq!(Level::Info as usize, 40); - assert_eq!(Level::Config as usize, 30); - assert_eq!(Level::Debug as usize, 20); - assert_eq!(Level::Trace as usize, 10); - } - - #[test] - fn test_level_from_log() { - assert_eq!(Level::from(log::Level::Error), Level::Error); - assert_eq!(Level::from(log::Level::Warn), Level::Warn); - assert_eq!(Level::from(log::Level::Info), Level::Info); - assert_eq!(Level::from(log::Level::Debug), Level::Debug); - assert_eq!(Level::from(log::Level::Trace), Level::Trace); - } - - #[test] - fn test_level_into_log() { - assert_eq!(Into::::into(Level::Fatal), log::Level::Error); - assert_eq!(Into::::into(Level::Error), log::Level::Error); - assert_eq!(Into::::into(Level::Warn), log::Level::Warn); - assert_eq!(Into::::into(Level::Info), log::Level::Info); - assert_eq!(Into::::into(Level::Config), log::Level::Debug); - assert_eq!(Into::::into(Level::Debug), log::Level::Debug); - assert_eq!(Into::::into(Level::Trace), log::Level::Trace); - } - - #[test] - fn test_level_into_pref() { - let tests = [ - (Level::Fatal, "Fatal"), - (Level::Error, "Error"), - (Level::Warn, "Warn"), - (Level::Info, "Info"), - (Level::Config, "Config"), - (Level::Debug, "Debug"), - (Level::Trace, "Trace"), - ]; - - for &(lvl, s) in tests.iter() { - let expected = Pref { - value: PrefValue::String(s.to_string()), - sticky: false, - }; - assert_eq!(Into::::into(lvl), expected); - } - } - - #[test] - fn test_level_from_str() { - assert_eq!(Level::from_str("fatal"), Ok(Level::Fatal)); - assert_eq!(Level::from_str("error"), Ok(Level::Error)); - assert_eq!(Level::from_str("warn"), Ok(Level::Warn)); - assert_eq!(Level::from_str("info"), Ok(Level::Info)); - assert_eq!(Level::from_str("config"), Ok(Level::Config)); - assert_eq!(Level::from_str("debug"), Ok(Level::Debug)); - assert_eq!(Level::from_str("trace"), Ok(Level::Trace)); - - assert_eq!(Level::from_str("INFO"), Ok(Level::Info)); - - assert!(Level::from_str("foo").is_err()); - } - - #[test] - fn test_level_to_str() { - assert_eq!(Level::Fatal.to_string(), "FATAL"); - assert_eq!(Level::Error.to_string(), "ERROR"); - assert_eq!(Level::Warn.to_string(), "WARN"); - assert_eq!(Level::Info.to_string(), "INFO"); - assert_eq!(Level::Config.to_string(), "CONFIG"); - assert_eq!(Level::Debug.to_string(), "DEBUG"); - assert_eq!(Level::Trace.to_string(), "TRACE"); - } - - #[test] - fn test_max_level() { - let _guard = LEVEL_MUTEX.lock(); - set_max_level(Level::Info); - assert_eq!(max_level(), Level::Info); - } - - #[test] - fn test_set_max_level() { - let _guard = LEVEL_MUTEX.lock(); - set_max_level(Level::Error); - assert_eq!(max_level(), Level::Error); - set_max_level(Level::Fatal); - assert_eq!(max_level(), Level::Fatal); - } - - #[test] - fn test_init_with_level() { - let _guard = LEVEL_MUTEX.lock(); - init_with_level(Level::Debug, false).unwrap(); - assert_eq!(max_level(), Level::Debug); - assert!(init_with_level(Level::Warn, false).is_err()); - } - - #[test] - fn test_format_ts() { - let ts = chrono::Local::now(); - let s = format_ts(ts); - assert_eq!(s.len(), 13); - } - - #[test] - fn test_truncate() { - let short_message = (0..MAX_STRING_LENGTH).map(|_| "x").collect::(); - // A message up to MAX_STRING_LENGTH is not truncated - assert_eq!(truncate_message(&format_args!("{}", short_message)), None); - - let long_message = (0..MAX_STRING_LENGTH + 1).map(|_| "x").collect::(); - let part = (0..MAX_STRING_LENGTH / 2).map(|_| "x").collect::(); - - // A message longer than MAX_STRING_LENGTH is not truncated if requested - set_truncate(false); - assert_eq!(truncate_message(&format_args!("{}", long_message)), None); - - // A message longer than MAX_STRING_LENGTH is truncated if requested - set_truncate(true); - assert_eq!( - truncate_message(&format_args!("{}", long_message)), - Some((part.to_owned(), part)) - ); - } -} diff --git a/python/drivers/geckodriver-0.33.0/src/main.rs b/python/drivers/geckodriver-0.33.0/src/main.rs deleted file mode 100644 index 64df65a..0000000 --- a/python/drivers/geckodriver-0.33.0/src/main.rs +++ /dev/null @@ -1,549 +0,0 @@ -#![forbid(unsafe_code)] - -extern crate chrono; -#[macro_use] -extern crate clap; -#[macro_use] -extern crate lazy_static; -extern crate hyper; -extern crate marionette as marionette_rs; -extern crate mozdevice; -extern crate mozprofile; -extern crate mozrunner; -extern crate mozversion; -extern crate regex; -extern crate serde; -#[macro_use] -extern crate serde_derive; -extern crate serde_json; -extern crate serde_yaml; -extern crate tempfile; -extern crate url; -extern crate uuid; -extern crate webdriver; -extern crate zip; - -#[macro_use] -extern crate log; - -use std::env; -use std::fmt; -use std::io; -use std::net::{IpAddr, SocketAddr, ToSocketAddrs}; -use std::path::PathBuf; -use std::result; -use std::str::FromStr; - -use clap::{AppSettings, Arg, Command}; - -macro_rules! try_opt { - ($expr:expr, $err_type:expr, $err_msg:expr) => {{ - match $expr { - Some(x) => x, - None => return Err(WebDriverError::new($err_type, $err_msg)), - } - }}; -} - -mod android; -mod browser; -mod build; -mod capabilities; -mod command; -mod logging; -mod marionette; -mod prefs; - -#[cfg(test)] -pub mod test; - -use crate::command::extension_routes; -use crate::logging::Level; -use crate::marionette::{MarionetteHandler, MarionetteSettings}; -use mozdevice::AndroidStorageInput; -use url::{Host, Url}; - -const EXIT_SUCCESS: i32 = 0; -const EXIT_USAGE: i32 = 64; -const EXIT_UNAVAILABLE: i32 = 69; - -enum FatalError { - Parsing(clap::Error), - Usage(String), - Server(io::Error), -} - -impl FatalError { - fn exit_code(&self) -> i32 { - use FatalError::*; - match *self { - Parsing(_) | Usage(_) => EXIT_USAGE, - Server(_) => EXIT_UNAVAILABLE, - } - } - - fn help_included(&self) -> bool { - matches!(*self, FatalError::Parsing(_)) - } -} - -impl From for FatalError { - fn from(err: clap::Error) -> FatalError { - FatalError::Parsing(err) - } -} - -impl From for FatalError { - fn from(err: io::Error) -> FatalError { - FatalError::Server(err) - } -} - -// harmonise error message from clap to avoid duplicate "error:" prefix -impl fmt::Display for FatalError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use FatalError::*; - let s = match *self { - Parsing(ref err) => err.to_string(), - Usage(ref s) => format!("error: {}", s), - Server(ref err) => format!("error: {}", err), - }; - write!(f, "{}", s) - } -} - -macro_rules! usage { - ($msg:expr) => { - return Err(FatalError::Usage($msg.to_string())) - }; - - ($fmt:expr, $($arg:tt)+) => { - return Err(FatalError::Usage(format!($fmt, $($arg)+))) - }; -} - -type ProgramResult = result::Result; - -#[allow(clippy::large_enum_variant)] -enum Operation { - Help, - Version, - Server { - log_level: Option, - log_truncate: bool, - address: SocketAddr, - allow_hosts: Vec, - allow_origins: Vec, - settings: MarionetteSettings, - deprecated_storage_arg: bool, - }, -} - -/// Get a socket address from the provided host and port -/// -/// # Arguments -/// * `webdriver_host` - The hostname on which the server will listen -/// * `webdriver_port` - The port on which the server will listen -/// -/// When the host and port resolve to multiple addresses, prefer -/// IPv4 addresses vs IPv6. -fn server_address(webdriver_host: &str, webdriver_port: u16) -> ProgramResult { - let mut socket_addrs = match format!("{}:{}", webdriver_host, webdriver_port).to_socket_addrs() - { - Ok(addrs) => addrs.collect::>(), - Err(e) => usage!("{}: {}:{}", e, webdriver_host, webdriver_port), - }; - if socket_addrs.is_empty() { - usage!( - "Unable to resolve host: {}:{}", - webdriver_host, - webdriver_port - ) - } - // Prefer ipv4 address - socket_addrs.sort_by(|a, b| { - let a_val = i32::from(!a.ip().is_ipv4()); - let b_val = i32::from(!b.ip().is_ipv4()); - a_val.partial_cmp(&b_val).expect("Comparison failed") - }); - Ok(socket_addrs.remove(0)) -} - -/// Parse a given string into a Host -fn parse_hostname(webdriver_host: &str) -> Result { - let host_str = if let Ok(ip_addr) = IpAddr::from_str(webdriver_host) { - // In this case we have an IP address as the host - if ip_addr.is_ipv6() { - // Convert to quoted form - format!("[{}]", &webdriver_host) - } else { - webdriver_host.into() - } - } else { - webdriver_host.into() - }; - - Host::parse(&host_str) -} - -/// Get a list of default hostnames to allow -/// -/// This only covers domain names, not IP addresses, since IP adresses -/// are always accepted. -fn get_default_allowed_hosts(ip: IpAddr) -> Vec> { - let localhost_is_loopback = ("localhost".to_string(), 80) - .to_socket_addrs() - .map(|addr_iter| { - addr_iter - .map(|addr| addr.ip()) - .filter(|ip| ip.is_loopback()) - }) - .iter() - .len() - > 0; - if ip.is_loopback() && localhost_is_loopback { - vec![Host::parse("localhost")] - } else { - vec![] - } -} - -fn get_allowed_hosts( - host: Host, - allow_hosts: Option, -) -> Result, url::ParseError> { - allow_hosts - .map(|hosts| hosts.map(Host::parse).collect::>()) - .unwrap_or_else(|| match host { - Host::Domain(_) => { - vec![Ok(host.clone())] - } - Host::Ipv4(ip) => get_default_allowed_hosts(IpAddr::V4(ip)), - Host::Ipv6(ip) => get_default_allowed_hosts(IpAddr::V6(ip)), - }) - .into_iter() - .collect::, url::ParseError>>() -} - -fn get_allowed_origins(allow_origins: Option) -> Result, url::ParseError> { - allow_origins - .map(|origins| { - origins - .map(Url::parse) - .collect::, url::ParseError>>() - }) - .unwrap_or_else(|| Ok(vec![])) -} - -fn parse_args(cmd: &mut Command) -> ProgramResult { - let args = cmd.try_get_matches_from_mut(env::args())?; - - if args.is_present("help") { - return Ok(Operation::Help); - } else if args.is_present("version") { - return Ok(Operation::Version); - } - - let log_level = if args.is_present("log_level") { - Level::from_str(args.value_of("log_level").unwrap()).ok() - } else { - Some(match args.occurrences_of("verbosity") { - 0 => Level::Info, - 1 => Level::Debug, - _ => Level::Trace, - }) - }; - - let webdriver_host = args.value_of("webdriver_host").unwrap(); - let webdriver_port = { - let s = args.value_of("webdriver_port").unwrap(); - match u16::from_str(s) { - Ok(n) => n, - Err(e) => usage!("invalid --port: {}: {}", e, s), - } - }; - - let android_storage = args - .value_of_t::("android_storage") - .unwrap_or(AndroidStorageInput::Auto); - - let binary = args.value_of("binary").map(PathBuf::from); - - let profile_root = args.value_of("profile_root").map(PathBuf::from); - - // Try to create a temporary directory on startup to check that the directory exists and is writable - { - let tmp_dir = if let Some(ref tmp_root) = profile_root { - tempfile::tempdir_in(tmp_root) - } else { - tempfile::tempdir() - }; - if tmp_dir.is_err() { - usage!("Unable to write to temporary directory; consider --profile-root with a writeable directory") - } - } - - let marionette_host = args.value_of("marionette_host").unwrap(); - let marionette_port = match args.value_of("marionette_port") { - Some(s) => match u16::from_str(s) { - Ok(n) => Some(n), - Err(e) => usage!("invalid --marionette-port: {}", e), - }, - None => None, - }; - - // For Android the port on the device must be the same as the one on the - // host. For now default to 9222, which is the default for --remote-debugging-port. - let websocket_port = match args.value_of("websocket_port") { - Some(s) => match u16::from_str(s) { - Ok(n) => n, - Err(e) => usage!("invalid --websocket-port: {}", e), - }, - None => 9222, - }; - - let host = match parse_hostname(webdriver_host) { - Ok(name) => name, - Err(e) => usage!("invalid --host {}: {}", webdriver_host, e), - }; - - let allow_hosts = match get_allowed_hosts(host, args.values_of("allow_hosts")) { - Ok(hosts) => hosts, - Err(e) => usage!("invalid --allow-hosts {}", e), - }; - - let allow_origins = match get_allowed_origins(args.values_of("allow_origins")) { - Ok(origins) => origins, - Err(e) => usage!("invalid --allow-origins {}", e), - }; - - let address = server_address(webdriver_host, webdriver_port)?; - - let settings = MarionetteSettings { - binary, - profile_root, - connect_existing: args.is_present("connect_existing"), - host: marionette_host.into(), - port: marionette_port, - websocket_port, - allow_hosts: allow_hosts.clone(), - allow_origins: allow_origins.clone(), - jsdebugger: args.is_present("jsdebugger"), - android_storage, - }; - Ok(Operation::Server { - log_level, - log_truncate: !args.is_present("log_no_truncate"), - allow_hosts, - allow_origins, - address, - settings, - deprecated_storage_arg: args.is_present("android_storage"), - }) -} - -fn inner_main(cmd: &mut Command) -> ProgramResult<()> { - match parse_args(cmd)? { - Operation::Help => print_help(cmd), - Operation::Version => print_version(), - - Operation::Server { - log_level, - log_truncate, - address, - allow_hosts, - allow_origins, - settings, - deprecated_storage_arg, - } => { - if let Some(ref level) = log_level { - logging::init_with_level(*level, log_truncate).unwrap(); - } else { - logging::init(log_truncate).unwrap(); - } - - if deprecated_storage_arg { - warn!("--android-storage argument is deprecated and will be removed soon."); - }; - - let handler = MarionetteHandler::new(settings); - let listening = webdriver::server::start( - address, - allow_hosts, - allow_origins, - handler, - extension_routes(), - )?; - info!("Listening on {}", listening.socket); - } - } - - Ok(()) -} - -fn main() { - use std::process::exit; - - let mut cmd = make_command(); - - // use std::process:Termination when it graduates - exit(match inner_main(&mut cmd) { - Ok(_) => EXIT_SUCCESS, - - Err(e) => { - eprintln!("{}: {}", get_program_name(), e); - if !e.help_included() { - print_help(&mut cmd); - } - - e.exit_code() - } - }); -} - -fn make_command<'a>() -> Command<'a> { - Command::new(format!("geckodriver {}", build::build_info())) - .setting(AppSettings::NoAutoHelp) - .setting(AppSettings::NoAutoVersion) - .about("WebDriver implementation for Firefox") - .arg( - Arg::new("webdriver_host") - .long("host") - .takes_value(true) - .value_name("HOST") - .default_value("127.0.0.1") - .help("Host IP to use for WebDriver server"), - ) - .arg( - Arg::new("webdriver_port") - .short('p') - .long("port") - .takes_value(true) - .value_name("PORT") - .default_value("4444") - .help("Port to use for WebDriver server"), - ) - .arg( - Arg::new("binary") - .short('b') - .long("binary") - .takes_value(true) - .value_name("BINARY") - .help("Path to the Firefox binary"), - ) - .arg( - Arg::new("marionette_host") - .long("marionette-host") - .takes_value(true) - .value_name("HOST") - .default_value("127.0.0.1") - .help("Host to use to connect to Gecko"), - ) - .arg( - Arg::new("marionette_port") - .long("marionette-port") - .takes_value(true) - .value_name("PORT") - .help("Port to use to connect to Gecko [default: system-allocated port]"), - ) - .arg( - Arg::new("websocket_port") - .long("websocket-port") - .takes_value(true) - .value_name("PORT") - .conflicts_with("connect_existing") - .help("Port to use to connect to WebDriver BiDi [default: 9222]"), - ) - .arg( - Arg::new("connect_existing") - .long("connect-existing") - .requires("marionette_port") - .help("Connect to an existing Firefox instance"), - ) - .arg( - Arg::new("jsdebugger") - .long("jsdebugger") - .help("Attach browser toolbox debugger for Firefox"), - ) - .arg( - Arg::new("verbosity") - .multiple_occurrences(true) - .conflicts_with("log_level") - .short('v') - .help("Log level verbosity (-v for debug and -vv for trace level)"), - ) - .arg( - Arg::new("log_level") - .long("log") - .takes_value(true) - .value_name("LEVEL") - .possible_values(["fatal", "error", "warn", "info", "config", "debug", "trace"]) - .help("Set Gecko log level"), - ) - .arg( - Arg::new("log_no_truncate") - .long("log-no-truncate") - .help("Disable truncation of long log lines"), - ) - .arg( - Arg::new("help") - .short('h') - .long("help") - .help("Prints this message"), - ) - .arg( - Arg::new("version") - .short('V') - .long("version") - .help("Prints version and copying information"), - ) - .arg( - Arg::new("profile_root") - .long("profile-root") - .takes_value(true) - .value_name("PROFILE_ROOT") - .help("Directory in which to create profiles. Defaults to the system temporary directory."), - ) - .arg( - Arg::new("android_storage") - .long("android-storage") - .possible_values(["auto", "app", "internal", "sdcard"]) - .value_name("ANDROID_STORAGE") - .help("Selects storage location to be used for test data (deprecated)."), - ) - .arg( - Arg::new("allow_hosts") - .long("allow-hosts") - .takes_value(true) - .multiple_values(true) - .value_name("ALLOW_HOSTS") - .help("List of hostnames to allow. By default the value of --host is allowed, and in addition if that's a well known local address, other variations on well known local addresses are allowed. If --allow-hosts is provided only exactly those hosts are allowed."), - ) - .arg( - Arg::new("allow_origins") - .long("allow-origins") - .takes_value(true) - .multiple_values(true) - .value_name("ALLOW_ORIGINS") - .help("List of request origins to allow. These must be formatted as scheme://host:port. By default any request with an origin header is rejected. If --allow-origins is provided then only exactly those origins are allowed."), - ) -} - -fn get_program_name() -> String { - env::args().next().unwrap() -} - -fn print_help(cmd: &mut Command) { - cmd.print_help().ok(); - println!(); -} - -fn print_version() { - println!("geckodriver {}", build::build_info()); - println!(); - println!("The source code of this program is available from"); - println!("testing/geckodriver in https://hg.mozilla.org/mozilla-central."); - println!(); - println!("This program is subject to the terms of the Mozilla Public License 2.0."); - println!("You can obtain a copy of the license at https://mozilla.org/MPL/2.0/."); -} diff --git a/python/drivers/geckodriver-0.33.0/src/marionette.rs b/python/drivers/geckodriver-0.33.0/src/marionette.rs deleted file mode 100644 index 836382b..0000000 --- a/python/drivers/geckodriver-0.33.0/src/marionette.rs +++ /dev/null @@ -1,1623 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use crate::browser::{Browser, LocalBrowser, RemoteBrowser}; -use crate::build; -use crate::capabilities::{FirefoxCapabilities, FirefoxOptions, ProfileType}; -use crate::command::{ - AddonInstallParameters, AddonUninstallParameters, GeckoContextParameters, - GeckoExtensionCommand, GeckoExtensionRoute, -}; -use crate::logging; -use marionette_rs::common::{ - Cookie as MarionetteCookie, Date as MarionetteDate, Frame as MarionetteFrame, - Timeouts as MarionetteTimeouts, WebElement as MarionetteWebElement, Window, -}; -use marionette_rs::marionette::AppStatus; -use marionette_rs::message::{Command, Message, MessageId, Request}; -use marionette_rs::webdriver::{ - Command as MarionetteWebDriverCommand, Keys as MarionetteKeys, Locator as MarionetteLocator, - NewWindow as MarionetteNewWindow, PrintMargins as MarionettePrintMargins, - PrintOrientation as MarionettePrintOrientation, PrintPage as MarionettePrintPage, - PrintParameters as MarionettePrintParameters, ScreenshotOptions, Script as MarionetteScript, - Selector as MarionetteSelector, Url as MarionetteUrl, WindowRect as MarionetteWindowRect, -}; -use mozdevice::AndroidStorageInput; -use serde::de::{self, Deserialize, Deserializer}; -use serde::ser::{Serialize, Serializer}; -use serde_json::{self, Map, Value}; -use std::io::prelude::*; -use std::io::Error as IoError; -use std::io::ErrorKind; -use std::io::Result as IoResult; -use std::net::{Shutdown, TcpListener, TcpStream}; -use std::path::PathBuf; -use std::sync::Mutex; -use std::thread; -use std::time; -use url::{Host, Url}; -use webdriver::capabilities::BrowserCapabilities; -use webdriver::command::WebDriverCommand::{ - AcceptAlert, AddCookie, CloseWindow, DeleteCookie, DeleteCookies, DeleteSession, DismissAlert, - ElementClear, ElementClick, ElementSendKeys, ExecuteAsyncScript, ExecuteScript, Extension, - FindElement, FindElementElement, FindElementElements, FindElements, FindShadowRootElement, - FindShadowRootElements, FullscreenWindow, Get, GetActiveElement, GetAlertText, GetCSSValue, - GetComputedLabel, GetComputedRole, GetCookies, GetCurrentUrl, GetElementAttribute, - GetElementProperty, GetElementRect, GetElementTagName, GetElementText, GetNamedCookie, - GetPageSource, GetShadowRoot, GetTimeouts, GetTitle, GetWindowHandle, GetWindowHandles, - GetWindowRect, GoBack, GoForward, IsDisplayed, IsEnabled, IsSelected, MaximizeWindow, - MinimizeWindow, NewSession, NewWindow, PerformActions, Print, Refresh, ReleaseActions, - SendAlertText, SetTimeouts, SetWindowRect, Status, SwitchToFrame, SwitchToParentFrame, - SwitchToWindow, TakeElementScreenshot, TakeScreenshot, -}; -use webdriver::command::{ - ActionsParameters, AddCookieParameters, GetNamedCookieParameters, GetParameters, - JavascriptCommandParameters, LocatorParameters, NewSessionParameters, NewWindowParameters, - PrintMargins, PrintOrientation, PrintPage, PrintParameters, SendKeysParameters, - SwitchToFrameParameters, SwitchToWindowParameters, TimeoutsParameters, WindowRectParameters, -}; -use webdriver::command::{WebDriverCommand, WebDriverMessage}; -use webdriver::common::{ - Cookie, Date, FrameId, LocatorStrategy, ShadowRoot, WebElement, ELEMENT_KEY, FRAME_KEY, - SHADOW_KEY, WINDOW_KEY, -}; -use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult}; -use webdriver::response::{ - CloseWindowResponse, CookieResponse, CookiesResponse, ElementRectResponse, NewSessionResponse, - NewWindowResponse, TimeoutsResponse, ValueResponse, WebDriverResponse, WindowRectResponse, -}; -use webdriver::server::{Session, WebDriverHandler}; -use webdriver::{capabilities::CapabilitiesMatching, server::SessionTeardownKind}; - -#[derive(Debug, PartialEq, Deserialize)] -struct MarionetteHandshake { - #[serde(rename = "marionetteProtocol")] - protocol: u16, - #[serde(rename = "applicationType")] - application_type: String, -} - -#[derive(Default)] -pub(crate) struct MarionetteSettings { - pub(crate) binary: Option, - pub(crate) profile_root: Option, - pub(crate) connect_existing: bool, - pub(crate) host: String, - pub(crate) port: Option, - pub(crate) websocket_port: u16, - pub(crate) allow_hosts: Vec, - pub(crate) allow_origins: Vec, - - /// Brings up the Browser Toolbox when starting Firefox, - /// letting you debug internals. - pub(crate) jsdebugger: bool, - - pub(crate) android_storage: AndroidStorageInput, -} - -#[derive(Default)] -pub(crate) struct MarionetteHandler { - connection: Mutex>, - settings: MarionetteSettings, -} - -impl MarionetteHandler { - pub(crate) fn new(settings: MarionetteSettings) -> MarionetteHandler { - MarionetteHandler { - connection: Mutex::new(None), - settings, - } - } - - fn create_connection( - &self, - session_id: Option, - new_session_parameters: &NewSessionParameters, - ) -> WebDriverResult { - let mut fx_capabilities = FirefoxCapabilities::new(self.settings.binary.as_ref()); - let (capabilities, options) = { - let mut capabilities = new_session_parameters - .match_browser(&mut fx_capabilities)? - .ok_or_else(|| { - WebDriverError::new( - ErrorStatus::SessionNotCreated, - "Unable to find a matching set of capabilities", - ) - })?; - - let options = FirefoxOptions::from_capabilities( - fx_capabilities.chosen_binary.clone(), - &self.settings, - &mut capabilities, - )?; - (capabilities, options) - }; - - if let Some(l) = options.log.level { - logging::set_max_level(l); - } - - let marionette_host = self.settings.host.to_owned(); - let marionette_port = match self.settings.port { - Some(port) => port, - None => { - // If we're launching Firefox Desktop version 95 or later, and there's no port - // specified, we can pass 0 as the port and later read it back from - // the profile. - let can_use_profile: bool = options.android.is_none() - && options.profile != ProfileType::Named - && !self.settings.connect_existing - && fx_capabilities - .browser_version(&capabilities) - .map(|opt_v| { - opt_v - .map(|v| { - fx_capabilities - .compare_browser_version(&v, ">=95") - .unwrap_or(false) - }) - .unwrap_or(false) - }) - .unwrap_or(false); - if can_use_profile { - 0 - } else { - get_free_port(&marionette_host)? - } - } - }; - - let websocket_port = if options.use_websocket { - Some(self.settings.websocket_port) - } else { - None - }; - - let browser = if options.android.is_some() { - // TODO: support connecting to running Apps. There's no real obstruction here, - // just some details about port forwarding to work through. We can't follow - // `chromedriver` here since it uses an abstract socket rather than a TCP socket: - // see bug 1240830 for thoughts on doing that for Marionette. - if self.settings.connect_existing { - return Err(WebDriverError::new( - ErrorStatus::SessionNotCreated, - "Cannot connect to an existing Android App yet", - )); - } - Browser::Remote(RemoteBrowser::new( - options, - marionette_port, - websocket_port, - self.settings.profile_root.as_deref(), - )?) - } else if !self.settings.connect_existing { - Browser::Local(LocalBrowser::new( - options, - marionette_port, - self.settings.jsdebugger, - self.settings.profile_root.as_deref(), - )?) - } else { - Browser::Existing(marionette_port) - }; - let session = MarionetteSession::new(session_id, capabilities); - MarionetteConnection::new(marionette_host, browser, session) - } - - fn close_connection(&mut self, wait_for_shutdown: bool) { - if let Ok(connection) = self.connection.get_mut() { - if let Some(conn) = connection.take() { - if let Err(e) = conn.close(wait_for_shutdown) { - error!("Failed to close browser connection: {}", e) - } - } - } - } -} - -impl WebDriverHandler for MarionetteHandler { - fn handle_command( - &mut self, - _: &Option, - msg: WebDriverMessage, - ) -> WebDriverResult { - // First handle the status message which doesn't actually require a marionette - // connection or message - if let Status = msg.command { - let (ready, message) = self - .connection - .get_mut() - .map(|ref connection| { - connection - .as_ref() - .map(|_| (false, "Session already started")) - .unwrap_or((true, "")) - }) - .unwrap_or((false, "geckodriver internal error")); - let mut value = Map::new(); - value.insert("ready".to_string(), Value::Bool(ready)); - value.insert("message".to_string(), Value::String(message.into())); - return Ok(WebDriverResponse::Generic(ValueResponse(Value::Object( - value, - )))); - } - - match self.connection.lock() { - Ok(mut connection) => { - if connection.is_none() { - if let NewSession(ref capabilities) = msg.command { - let conn = self.create_connection(msg.session_id.clone(), capabilities)?; - *connection = Some(conn); - } else { - return Err(WebDriverError::new( - ErrorStatus::InvalidSessionId, - "Tried to run command without establishing a connection", - )); - } - } - let conn = connection.as_mut().expect("Missing connection"); - conn.send_command(&msg).map_err(|mut err| { - // Shutdown the browser if no session can - // be established due to errors. - if let NewSession(_) = msg.command { - err.delete_session = true; - } - err - }) - } - Err(_) => Err(WebDriverError::new( - ErrorStatus::UnknownError, - "Failed to aquire Marionette connection", - )), - } - } - - fn teardown_session(&mut self, kind: SessionTeardownKind) { - let wait_for_shutdown = match kind { - SessionTeardownKind::Deleted => true, - SessionTeardownKind::NotDeleted => false, - }; - self.close_connection(wait_for_shutdown); - } -} - -impl Drop for MarionetteHandler { - fn drop(&mut self) { - self.close_connection(false); - } -} - -struct MarionetteSession { - session_id: String, - capabilities: Map, - command_id: MessageId, -} - -impl MarionetteSession { - fn new(session_id: Option, capabilities: Map) -> MarionetteSession { - let initital_id = session_id.unwrap_or_default(); - MarionetteSession { - session_id: initital_id, - capabilities, - command_id: 0, - } - } - - fn update( - &mut self, - msg: &WebDriverMessage, - resp: &MarionetteResponse, - ) -> WebDriverResult<()> { - if let NewSession(_) = msg.command { - let session_id = try_opt!( - try_opt!( - resp.result.get("sessionId"), - ErrorStatus::SessionNotCreated, - "Unable to get session id" - ) - .as_str(), - ErrorStatus::SessionNotCreated, - "Unable to convert session id to string" - ); - self.session_id = session_id.to_string(); - }; - Ok(()) - } - - /// Converts a Marionette JSON response into a `WebElement`. - /// - /// Note that it currently coerces all chrome elements, web frames, and web - /// windows also into web elements. This will change at a later point. - fn to_web_element(&self, json_data: &Value) -> WebDriverResult { - let data = try_opt!( - json_data.as_object(), - ErrorStatus::UnknownError, - "Failed to convert data to an object" - ); - - let element = data.get(ELEMENT_KEY); - let frame = data.get(FRAME_KEY); - let window = data.get(WINDOW_KEY); - - let value = try_opt!( - element.or(frame).or(window), - ErrorStatus::UnknownError, - "Failed to extract web element from Marionette response" - ); - let id = try_opt!( - value.as_str(), - ErrorStatus::UnknownError, - "Failed to convert web element reference value to string" - ) - .to_string(); - Ok(WebElement(id)) - } - - /// Converts a Marionette JSON response into a `ShadowRoot`. - fn to_shadow_root(&self, json_data: &Value) -> WebDriverResult { - let data = try_opt!( - json_data.as_object(), - ErrorStatus::UnknownError, - "Failed to convert data to an object" - ); - - let shadow_root = data.get(SHADOW_KEY); - - let value = try_opt!( - shadow_root, - ErrorStatus::UnknownError, - "Failed to extract shadow root from Marionette response" - ); - let id = try_opt!( - value.as_str(), - ErrorStatus::UnknownError, - "Failed to convert shadow root reference value to string" - ) - .to_string(); - Ok(ShadowRoot(id)) - } - - fn next_command_id(&mut self) -> MessageId { - self.command_id += 1; - self.command_id - } - - fn response( - &mut self, - msg: &WebDriverMessage, - resp: MarionetteResponse, - ) -> WebDriverResult { - use self::GeckoExtensionCommand::*; - - if resp.id != self.command_id { - return Err(WebDriverError::new( - ErrorStatus::UnknownError, - format!( - "Marionette responses arrived out of sequence, expected {}, got {}", - self.command_id, resp.id - ), - )); - } - - if let Some(error) = resp.error { - return Err(error.into()); - } - - self.update(msg, &resp)?; - - Ok(match msg.command { - // Everything that doesn't have a response value - Get(_) - | GoBack - | GoForward - | Refresh - | SetTimeouts(_) - | SwitchToWindow(_) - | SwitchToFrame(_) - | SwitchToParentFrame - | AddCookie(_) - | DeleteCookies - | DeleteCookie(_) - | DismissAlert - | AcceptAlert - | SendAlertText(_) - | ElementClick(_) - | ElementClear(_) - | ElementSendKeys(_, _) - | PerformActions(_) - | ReleaseActions => WebDriverResponse::Void, - // Things that simply return the contents of the marionette "value" property - GetCurrentUrl - | GetTitle - | GetPageSource - | GetWindowHandle - | IsDisplayed(_) - | IsSelected(_) - | GetElementAttribute(_, _) - | GetElementProperty(_, _) - | GetCSSValue(_, _) - | GetElementText(_) - | GetElementTagName(_) - | GetComputedLabel(_) - | GetComputedRole(_) - | IsEnabled(_) - | ExecuteScript(_) - | ExecuteAsyncScript(_) - | GetAlertText - | TakeScreenshot - | Print(_) - | TakeElementScreenshot(_) => { - WebDriverResponse::Generic(resp.into_value_response(true)?) - } - GetTimeouts => { - let script = match try_opt!( - resp.result.get("script"), - ErrorStatus::UnknownError, - "Missing field: script" - ) { - Value::Null => None, - n => try_opt!( - Some(n.as_u64()), - ErrorStatus::UnknownError, - "Failed to interpret script timeout duration as u64" - ), - }; - let page_load = try_opt!( - try_opt!( - resp.result.get("pageLoad"), - ErrorStatus::UnknownError, - "Missing field: pageLoad" - ) - .as_u64(), - ErrorStatus::UnknownError, - "Failed to interpret page load duration as u64" - ); - let implicit = try_opt!( - try_opt!( - resp.result.get("implicit"), - ErrorStatus::UnknownError, - "Missing field: implicit" - ) - .as_u64(), - ErrorStatus::UnknownError, - "Failed to interpret implicit search duration as u64" - ); - - WebDriverResponse::Timeouts(TimeoutsResponse { - script, - page_load, - implicit, - }) - } - Status => panic!("Got status command that should already have been handled"), - GetWindowHandles => WebDriverResponse::Generic(resp.into_value_response(false)?), - NewWindow(_) => { - let handle: String = try_opt!( - try_opt!( - resp.result.get("handle"), - ErrorStatus::UnknownError, - "Failed to find handle field" - ) - .as_str(), - ErrorStatus::UnknownError, - "Failed to interpret handle as string" - ) - .into(); - let typ: String = try_opt!( - try_opt!( - resp.result.get("type"), - ErrorStatus::UnknownError, - "Failed to find type field" - ) - .as_str(), - ErrorStatus::UnknownError, - "Failed to interpret type as string" - ) - .into(); - - WebDriverResponse::NewWindow(NewWindowResponse { handle, typ }) - } - CloseWindow => { - let data = try_opt!( - resp.result.as_array(), - ErrorStatus::UnknownError, - "Failed to interpret value as array" - ); - let handles = data - .iter() - .map(|x| { - Ok(try_opt!( - x.as_str(), - ErrorStatus::UnknownError, - "Failed to interpret window handle as string" - ) - .to_owned()) - }) - .collect::, _>>()?; - WebDriverResponse::CloseWindow(CloseWindowResponse(handles)) - } - GetElementRect(_) => { - let x = try_opt!( - try_opt!( - resp.result.get("x"), - ErrorStatus::UnknownError, - "Failed to find x field" - ) - .as_f64(), - ErrorStatus::UnknownError, - "Failed to interpret x as float" - ); - - let y = try_opt!( - try_opt!( - resp.result.get("y"), - ErrorStatus::UnknownError, - "Failed to find y field" - ) - .as_f64(), - ErrorStatus::UnknownError, - "Failed to interpret y as float" - ); - - let width = try_opt!( - try_opt!( - resp.result.get("width"), - ErrorStatus::UnknownError, - "Failed to find width field" - ) - .as_f64(), - ErrorStatus::UnknownError, - "Failed to interpret width as float" - ); - - let height = try_opt!( - try_opt!( - resp.result.get("height"), - ErrorStatus::UnknownError, - "Failed to find height field" - ) - .as_f64(), - ErrorStatus::UnknownError, - "Failed to interpret width as float" - ); - - let rect = ElementRectResponse { - x, - y, - width, - height, - }; - WebDriverResponse::ElementRect(rect) - } - FullscreenWindow | MinimizeWindow | MaximizeWindow | GetWindowRect - | SetWindowRect(_) => { - let width = try_opt!( - try_opt!( - resp.result.get("width"), - ErrorStatus::UnknownError, - "Failed to find width field" - ) - .as_u64(), - ErrorStatus::UnknownError, - "Failed to interpret width as positive integer" - ); - - let height = try_opt!( - try_opt!( - resp.result.get("height"), - ErrorStatus::UnknownError, - "Failed to find heigenht field" - ) - .as_u64(), - ErrorStatus::UnknownError, - "Failed to interpret height as positive integer" - ); - - let x = try_opt!( - try_opt!( - resp.result.get("x"), - ErrorStatus::UnknownError, - "Failed to find x field" - ) - .as_i64(), - ErrorStatus::UnknownError, - "Failed to interpret x as integer" - ); - - let y = try_opt!( - try_opt!( - resp.result.get("y"), - ErrorStatus::UnknownError, - "Failed to find y field" - ) - .as_i64(), - ErrorStatus::UnknownError, - "Failed to interpret y as integer" - ); - - let rect = WindowRectResponse { - x: x as i32, - y: y as i32, - width: width as i32, - height: height as i32, - }; - WebDriverResponse::WindowRect(rect) - } - GetCookies => { - let cookies: Vec = serde_json::from_value(resp.result)?; - WebDriverResponse::Cookies(CookiesResponse(cookies)) - } - GetNamedCookie(ref name) => { - let mut cookies: Vec = serde_json::from_value(resp.result)?; - cookies.retain(|x| x.name == *name); - let cookie = try_opt!( - cookies.pop(), - ErrorStatus::NoSuchCookie, - format!("No cookie with name {}", name) - ); - WebDriverResponse::Cookie(CookieResponse(cookie)) - } - FindElement(_) | FindElementElement(_, _) | FindShadowRootElement(_, _) => { - let element = self.to_web_element(try_opt!( - resp.result.get("value"), - ErrorStatus::UnknownError, - "Failed to find value field" - ))?; - WebDriverResponse::Generic(ValueResponse(serde_json::to_value(element)?)) - } - FindElements(_) | FindElementElements(_, _) | FindShadowRootElements(_, _) => { - let element_vec = try_opt!( - resp.result.as_array(), - ErrorStatus::UnknownError, - "Failed to interpret value as array" - ); - let elements = element_vec - .iter() - .map(|x| self.to_web_element(x)) - .collect::, _>>()?; - - // TODO(Henrik): How to remove unwrap? - WebDriverResponse::Generic(ValueResponse(Value::Array( - elements - .iter() - .map(|x| serde_json::to_value(x).unwrap()) - .collect(), - ))) - } - GetShadowRoot(_) => { - let shadow_root = self.to_shadow_root(try_opt!( - resp.result.get("value"), - ErrorStatus::UnknownError, - "Failed to find value field" - ))?; - WebDriverResponse::Generic(ValueResponse(serde_json::to_value(shadow_root)?)) - } - GetActiveElement => { - let element = self.to_web_element(try_opt!( - resp.result.get("value"), - ErrorStatus::UnknownError, - "Failed to find value field" - ))?; - WebDriverResponse::Generic(ValueResponse(serde_json::to_value(element)?)) - } - NewSession(_) => { - let session_id = try_opt!( - try_opt!( - resp.result.get("sessionId"), - ErrorStatus::InvalidSessionId, - "Failed to find sessionId field" - ) - .as_str(), - ErrorStatus::InvalidSessionId, - "sessionId is not a string" - ); - - let mut capabilities = try_opt!( - try_opt!( - resp.result.get("capabilities"), - ErrorStatus::UnknownError, - "Failed to find capabilities field" - ) - .as_object(), - ErrorStatus::UnknownError, - "capabilities field is not an object" - ) - .clone(); - - capabilities.insert("moz:geckodriverVersion".into(), build::build_info().into()); - - WebDriverResponse::NewSession(NewSessionResponse::new( - session_id.to_string(), - Value::Object(capabilities), - )) - } - DeleteSession => WebDriverResponse::DeleteSession, - Extension(ref extension) => match extension { - GetContext => WebDriverResponse::Generic(resp.into_value_response(true)?), - SetContext(_) => WebDriverResponse::Void, - InstallAddon(_) => WebDriverResponse::Generic(resp.into_value_response(true)?), - UninstallAddon(_) => WebDriverResponse::Void, - TakeFullScreenshot => WebDriverResponse::Generic(resp.into_value_response(true)?), - }, - }) - } -} - -fn try_convert_to_marionette_message( - msg: &WebDriverMessage, - browser: &Browser, -) -> WebDriverResult> { - use self::GeckoExtensionCommand::*; - use self::WebDriverCommand::*; - - Ok(match msg.command { - AcceptAlert => Some(Command::WebDriver(MarionetteWebDriverCommand::AcceptAlert)), - AddCookie(ref x) => Some(Command::WebDriver(MarionetteWebDriverCommand::AddCookie( - x.to_marionette()?, - ))), - CloseWindow => Some(Command::WebDriver(MarionetteWebDriverCommand::CloseWindow)), - DeleteCookie(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::DeleteCookie(x.clone()), - )), - DeleteCookies => Some(Command::WebDriver( - MarionetteWebDriverCommand::DeleteCookies, - )), - DeleteSession => match browser { - Browser::Local(_) | Browser::Remote(_) => Some(Command::Marionette( - marionette_rs::marionette::Command::DeleteSession { - flags: vec![AppStatus::eForceQuit], - }, - )), - Browser::Existing(_) => Some(Command::WebDriver( - MarionetteWebDriverCommand::DeleteSession, - )), - }, - DismissAlert => Some(Command::WebDriver(MarionetteWebDriverCommand::DismissAlert)), - ElementClear(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::ElementClear { - id: e.clone().to_string(), - }, - )), - ElementClick(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::ElementClick { - id: e.clone().to_string(), - }, - )), - ElementSendKeys(ref e, ref x) => { - let keys = x.to_marionette()?; - Some(Command::WebDriver( - MarionetteWebDriverCommand::ElementSendKeys { - id: e.clone().to_string(), - text: keys.text.clone(), - value: keys.value, - }, - )) - } - ExecuteAsyncScript(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::ExecuteAsyncScript(x.to_marionette()?), - )), - ExecuteScript(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::ExecuteScript(x.to_marionette()?), - )), - FindElement(ref x) => Some(Command::WebDriver(MarionetteWebDriverCommand::FindElement( - x.to_marionette()?, - ))), - FindElements(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::FindElements(x.to_marionette()?), - )), - FindElementElement(ref e, ref x) => { - let locator = x.to_marionette()?; - Some(Command::WebDriver( - MarionetteWebDriverCommand::FindElementElement { - element: e.clone().to_string(), - using: locator.using.clone(), - value: locator.value, - }, - )) - } - FindElementElements(ref e, ref x) => { - let locator = x.to_marionette()?; - Some(Command::WebDriver( - MarionetteWebDriverCommand::FindElementElements { - element: e.clone().to_string(), - using: locator.using.clone(), - value: locator.value, - }, - )) - } - FindShadowRootElement(ref s, ref x) => { - let locator = x.to_marionette()?; - Some(Command::WebDriver( - MarionetteWebDriverCommand::FindShadowRootElement { - shadow_root: s.clone().to_string(), - using: locator.using.clone(), - value: locator.value, - }, - )) - } - FindShadowRootElements(ref s, ref x) => { - let locator = x.to_marionette()?; - Some(Command::WebDriver( - MarionetteWebDriverCommand::FindShadowRootElements { - shadow_root: s.clone().to_string(), - using: locator.using.clone(), - value: locator.value, - }, - )) - } - FullscreenWindow => Some(Command::WebDriver( - MarionetteWebDriverCommand::FullscreenWindow, - )), - Get(ref x) => Some(Command::WebDriver(MarionetteWebDriverCommand::Get( - x.to_marionette()?, - ))), - GetActiveElement => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetActiveElement, - )), - GetAlertText => Some(Command::WebDriver(MarionetteWebDriverCommand::GetAlertText)), - GetComputedLabel(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetComputedLabel { - id: e.clone().to_string(), - }, - )), - GetComputedRole(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetComputedRole { - id: e.clone().to_string(), - }, - )), - GetCookies | GetNamedCookie(_) => { - Some(Command::WebDriver(MarionetteWebDriverCommand::GetCookies)) - } - GetCSSValue(ref e, ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetCSSValue { - id: e.clone().to_string(), - property: x.clone(), - }, - )), - GetCurrentUrl => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetCurrentUrl, - )), - GetElementAttribute(ref e, ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetElementAttribute { - id: e.clone().to_string(), - name: x.clone(), - }, - )), - GetElementProperty(ref e, ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetElementProperty { - id: e.clone().to_string(), - name: x.clone(), - }, - )), - GetElementRect(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetElementRect { - id: e.clone().to_string(), - }, - )), - GetElementTagName(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetElementTagName { - id: e.clone().to_string(), - }, - )), - GetElementText(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetElementText { - id: e.clone().to_string(), - }, - )), - GetPageSource => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetPageSource, - )), - GetShadowRoot(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetShadowRoot { - id: e.clone().to_string(), - }, - )), - GetTitle => Some(Command::WebDriver(MarionetteWebDriverCommand::GetTitle)), - GetWindowHandle => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetWindowHandle, - )), - GetWindowHandles => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetWindowHandles, - )), - GetWindowRect => Some(Command::WebDriver( - MarionetteWebDriverCommand::GetWindowRect, - )), - GetTimeouts => Some(Command::WebDriver(MarionetteWebDriverCommand::GetTimeouts)), - GoBack => Some(Command::WebDriver(MarionetteWebDriverCommand::GoBack)), - GoForward => Some(Command::WebDriver(MarionetteWebDriverCommand::GoForward)), - IsDisplayed(ref e) => Some(Command::WebDriver( - MarionetteWebDriverCommand::IsDisplayed { - id: e.clone().to_string(), - }, - )), - IsEnabled(ref e) => Some(Command::WebDriver(MarionetteWebDriverCommand::IsEnabled { - id: e.clone().to_string(), - })), - IsSelected(ref e) => Some(Command::WebDriver(MarionetteWebDriverCommand::IsSelected { - id: e.clone().to_string(), - })), - MaximizeWindow => Some(Command::WebDriver( - MarionetteWebDriverCommand::MaximizeWindow, - )), - MinimizeWindow => Some(Command::WebDriver( - MarionetteWebDriverCommand::MinimizeWindow, - )), - NewWindow(ref x) => Some(Command::WebDriver(MarionetteWebDriverCommand::NewWindow( - x.to_marionette()?, - ))), - Print(ref x) => Some(Command::WebDriver(MarionetteWebDriverCommand::Print( - x.to_marionette()?, - ))), - Refresh => Some(Command::WebDriver(MarionetteWebDriverCommand::Refresh)), - ReleaseActions => Some(Command::WebDriver( - MarionetteWebDriverCommand::ReleaseActions, - )), - SendAlertText(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::SendAlertText(x.to_marionette()?), - )), - SetTimeouts(ref x) => Some(Command::WebDriver(MarionetteWebDriverCommand::SetTimeouts( - x.to_marionette()?, - ))), - SetWindowRect(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::SetWindowRect(x.to_marionette()?), - )), - SwitchToFrame(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::SwitchToFrame(x.to_marionette()?), - )), - SwitchToParentFrame => Some(Command::WebDriver( - MarionetteWebDriverCommand::SwitchToParentFrame, - )), - SwitchToWindow(ref x) => Some(Command::WebDriver( - MarionetteWebDriverCommand::SwitchToWindow(x.to_marionette()?), - )), - TakeElementScreenshot(ref e) => { - let screenshot = ScreenshotOptions { - id: Some(e.clone().to_string()), - highlights: vec![], - full: false, - }; - Some(Command::WebDriver( - MarionetteWebDriverCommand::TakeElementScreenshot(screenshot), - )) - } - TakeScreenshot => { - let screenshot = ScreenshotOptions { - id: None, - highlights: vec![], - full: false, - }; - Some(Command::WebDriver( - MarionetteWebDriverCommand::TakeScreenshot(screenshot), - )) - } - Extension(TakeFullScreenshot) => { - let screenshot = ScreenshotOptions { - id: None, - highlights: vec![], - full: true, - }; - Some(Command::WebDriver( - MarionetteWebDriverCommand::TakeFullScreenshot(screenshot), - )) - } - _ => None, - }) -} - -#[derive(Debug, PartialEq)] -struct MarionetteCommand { - id: MessageId, - name: String, - params: Map, -} - -impl Serialize for MarionetteCommand { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let data = (&0, &self.id, &self.name, &self.params); - data.serialize(serializer) - } -} - -impl MarionetteCommand { - fn new(id: MessageId, name: String, params: Map) -> MarionetteCommand { - MarionetteCommand { id, name, params } - } - - fn encode_msg(msg: T) -> WebDriverResult - where - T: serde::Serialize, - { - let data = serde_json::to_string(&msg)?; - - Ok(format!("{}:{}", data.len(), data)) - } - - fn from_webdriver_message( - id: MessageId, - capabilities: &Map, - browser: &Browser, - msg: &WebDriverMessage, - ) -> WebDriverResult { - use self::GeckoExtensionCommand::*; - - if let Some(cmd) = try_convert_to_marionette_message(msg, browser)? { - let req = Message::Incoming(Request(id, cmd)); - MarionetteCommand::encode_msg(req) - } else { - let (opt_name, opt_parameters) = match msg.command { - Status => panic!("Got status command that should already have been handled"), - NewSession(_) => { - let mut data = Map::new(); - for (k, v) in capabilities.iter() { - data.insert(k.to_string(), serde_json::to_value(v)?); - } - - (Some("WebDriver:NewSession"), Some(Ok(data))) - } - PerformActions(ref x) => { - (Some("WebDriver:PerformActions"), Some(x.to_marionette())) - } - Extension(ref extension) => match extension { - GetContext => (Some("Marionette:GetContext"), None), - InstallAddon(x) => (Some("Addon:Install"), Some(x.to_marionette())), - SetContext(x) => (Some("Marionette:SetContext"), Some(x.to_marionette())), - UninstallAddon(x) => (Some("Addon:Uninstall"), Some(x.to_marionette())), - _ => (None, None), - }, - _ => (None, None), - }; - - let name = try_opt!( - opt_name, - ErrorStatus::UnsupportedOperation, - "Operation not supported" - ); - let parameters = opt_parameters.unwrap_or_else(|| Ok(Map::new()))?; - - let req = MarionetteCommand::new(id, name.into(), parameters); - MarionetteCommand::encode_msg(req) - } - } -} - -#[derive(Debug, PartialEq)] -struct MarionetteResponse { - id: MessageId, - error: Option, - result: Value, -} - -impl<'de> Deserialize<'de> for MarionetteResponse { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Deserialize)] - struct ResponseWrapper { - msg_type: u64, - id: MessageId, - error: Option, - result: Value, - } - - let wrapper: ResponseWrapper = Deserialize::deserialize(deserializer)?; - - if wrapper.msg_type != 1 { - return Err(de::Error::custom( - "Expected '1' in first element of response", - )); - }; - - Ok(MarionetteResponse { - id: wrapper.id, - error: wrapper.error, - result: wrapper.result, - }) - } -} - -impl MarionetteResponse { - fn into_value_response(self, value_required: bool) -> WebDriverResult { - let value: &Value = if value_required { - try_opt!( - self.result.get("value"), - ErrorStatus::UnknownError, - "Failed to find value field" - ) - } else { - &self.result - }; - - Ok(ValueResponse(value.clone())) - } -} - -#[derive(Debug, PartialEq, Serialize, Deserialize)] -struct MarionetteError { - #[serde(rename = "error")] - code: String, - message: String, - stacktrace: Option, -} - -impl From for WebDriverError { - fn from(error: MarionetteError) -> WebDriverError { - let status = ErrorStatus::from(error.code); - let message = error.message; - - if let Some(stack) = error.stacktrace { - WebDriverError::new_with_stack(status, message, stack) - } else { - WebDriverError::new(status, message) - } - } -} - -fn get_free_port(host: &str) -> IoResult { - TcpListener::bind((host, 0)) - .and_then(|stream| stream.local_addr()) - .map(|x| x.port()) -} - -struct MarionetteConnection { - browser: Browser, - session: MarionetteSession, - stream: TcpStream, -} - -impl MarionetteConnection { - fn new( - host: String, - mut browser: Browser, - session: MarionetteSession, - ) -> WebDriverResult { - let stream = match MarionetteConnection::connect(&host, &mut browser) { - Ok(stream) => stream, - Err(e) => { - if let Err(e) = browser.close(true) { - error!("Failed to stop browser: {:?}", e); - } - return Err(e); - } - }; - Ok(MarionetteConnection { - browser, - session, - stream, - }) - } - - fn connect(host: &str, browser: &mut Browser) -> WebDriverResult { - let timeout = time::Duration::from_secs(60); - let poll_interval = time::Duration::from_millis(100); - let now = time::Instant::now(); - - debug!( - "Waiting {}s to connect to browser on {}", - timeout.as_secs(), - host, - ); - - loop { - // immediately abort connection attempts if process disappears - if let Browser::Local(browser) = browser { - if let Some(status) = browser.check_status() { - return Err(WebDriverError::new( - ErrorStatus::UnknownError, - format!("Process unexpectedly closed with status {}", status), - )); - } - } - - let last_err; - - if let Some(port) = browser.marionette_port()? { - match MarionetteConnection::try_connect(host, port) { - Ok(stream) => { - debug!("Connection to Marionette established on {}:{}.", host, port); - browser.update_marionette_port(port); - return Ok(stream); - } - Err(e) => { - let err_str = e.to_string(); - last_err = Some(err_str); - } - } - } else { - last_err = Some("Failed to read marionette port".into()); - } - if now.elapsed() < timeout { - trace!("Retrying in {:?}", poll_interval); - thread::sleep(poll_interval); - } else { - return Err(WebDriverError::new( - ErrorStatus::Timeout, - last_err.unwrap_or_else(|| "Unknown error".into()), - )); - } - } - } - - fn try_connect(host: &str, port: u16) -> WebDriverResult { - let mut stream = TcpStream::connect((host, port))?; - MarionetteConnection::handshake(&mut stream)?; - Ok(stream) - } - - fn handshake(stream: &mut TcpStream) -> WebDriverResult { - let resp = (match stream.read_timeout() { - Ok(timeout) => { - // If platform supports changing the read timeout of the stream, - // use a short one only for the handshake with Marionette. Don't - // make it shorter as 1000ms to not fail on slow connections. - stream - .set_read_timeout(Some(time::Duration::from_millis(1000))) - .ok(); - let data = MarionetteConnection::read_resp(stream); - stream.set_read_timeout(timeout).ok(); - - data - } - _ => MarionetteConnection::read_resp(stream), - }) - .map_err(|e| { - WebDriverError::new( - ErrorStatus::UnknownError, - format!("Socket timeout reading Marionette handshake data: {}", e), - ) - })?; - - let data = serde_json::from_str::(&resp)?; - - if data.application_type != "gecko" { - return Err(WebDriverError::new( - ErrorStatus::UnknownError, - format!("Unrecognized application type {}", data.application_type), - )); - } - - if data.protocol != 3 { - return Err(WebDriverError::new( - ErrorStatus::UnknownError, - format!( - "Unsupported Marionette protocol version {}, required 3", - data.protocol - ), - )); - } - - Ok(data) - } - - fn close(self, wait_for_shutdown: bool) -> WebDriverResult<()> { - self.stream.shutdown(Shutdown::Both)?; - self.browser.close(wait_for_shutdown)?; - Ok(()) - } - - fn send_command( - &mut self, - msg: &WebDriverMessage, - ) -> WebDriverResult { - let id = self.session.next_command_id(); - let enc_cmd = MarionetteCommand::from_webdriver_message( - id, - &self.session.capabilities, - &self.browser, - msg, - )?; - let resp_data = self.send(enc_cmd)?; - let data: MarionetteResponse = serde_json::from_str(&resp_data)?; - - self.session.response(msg, data) - } - - fn send(&mut self, data: String) -> WebDriverResult { - if self.stream.write(data.as_bytes()).is_err() { - let mut err = WebDriverError::new( - ErrorStatus::UnknownError, - "Failed to write request to stream", - ); - err.delete_session = true; - return Err(err); - } - - match MarionetteConnection::read_resp(&mut self.stream) { - Ok(resp) => Ok(resp), - Err(_) => { - let mut err = WebDriverError::new( - ErrorStatus::UnknownError, - "Failed to decode response from marionette", - ); - err.delete_session = true; - Err(err) - } - } - } - - fn read_resp(stream: &mut TcpStream) -> IoResult { - let mut bytes = 0usize; - - loop { - let buf = &mut [0u8]; - let num_read = stream.read(buf)?; - let byte = match num_read { - 0 => { - return Err(IoError::new( - ErrorKind::Other, - "EOF reading marionette message", - )) - } - 1 => buf[0], - _ => panic!("Expected one byte got more"), - } as char; - match byte { - '0'..='9' => { - bytes *= 10; - bytes += byte as usize - '0' as usize; - } - ':' => break, - _ => {} - } - } - - let buf = &mut [0u8; 8192]; - let mut payload = Vec::with_capacity(bytes); - let mut total_read = 0; - while total_read < bytes { - let num_read = stream.read(buf)?; - if num_read == 0 { - return Err(IoError::new( - ErrorKind::Other, - "EOF reading marionette message", - )); - } - total_read += num_read; - for x in &buf[..num_read] { - payload.push(*x); - } - } - - // TODO(jgraham): Need to handle the error here - Ok(String::from_utf8(payload).unwrap()) - } -} - -trait ToMarionette { - fn to_marionette(&self) -> WebDriverResult; -} - -impl ToMarionette> for AddonInstallParameters { - fn to_marionette(&self) -> WebDriverResult> { - let mut data = Map::new(); - data.insert("path".to_string(), serde_json::to_value(&self.path)?); - if self.temporary.is_some() { - data.insert( - "temporary".to_string(), - serde_json::to_value(self.temporary)?, - ); - } - Ok(data) - } -} - -impl ToMarionette> for AddonUninstallParameters { - fn to_marionette(&self) -> WebDriverResult> { - let mut data = Map::new(); - data.insert("id".to_string(), Value::String(self.id.clone())); - Ok(data) - } -} - -impl ToMarionette> for GeckoContextParameters { - fn to_marionette(&self) -> WebDriverResult> { - let mut data = Map::new(); - data.insert( - "value".to_owned(), - serde_json::to_value(self.context.clone())?, - ); - Ok(data) - } -} - -impl ToMarionette for PrintParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionettePrintParameters { - orientation: self.orientation.to_marionette()?, - scale: self.scale, - background: self.background, - page: self.page.to_marionette()?, - margin: self.margin.to_marionette()?, - page_ranges: self.page_ranges.clone(), - shrink_to_fit: self.shrink_to_fit, - }) - } -} - -impl ToMarionette for PrintOrientation { - fn to_marionette(&self) -> WebDriverResult { - Ok(match self { - PrintOrientation::Landscape => MarionettePrintOrientation::Landscape, - PrintOrientation::Portrait => MarionettePrintOrientation::Portrait, - }) - } -} - -impl ToMarionette for PrintPage { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionettePrintPage { - width: self.width, - height: self.height, - }) - } -} - -impl ToMarionette for PrintMargins { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionettePrintMargins { - top: self.top, - bottom: self.bottom, - left: self.left, - right: self.right, - }) - } -} - -impl ToMarionette> for ActionsParameters { - fn to_marionette(&self) -> WebDriverResult> { - Ok(try_opt!( - serde_json::to_value(self)?.as_object(), - ErrorStatus::UnknownError, - "Expected an object" - ) - .clone()) - } -} - -impl ToMarionette for AddCookieParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteCookie { - name: self.name.clone(), - value: self.value.clone(), - path: self.path.clone(), - domain: self.domain.clone(), - secure: self.secure, - http_only: self.httpOnly, - expiry: match &self.expiry { - Some(date) => Some(date.to_marionette()?), - None => None, - }, - same_site: self.sameSite.clone(), - }) - } -} - -impl ToMarionette for Date { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteDate(self.0)) - } -} - -impl ToMarionette> for GetNamedCookieParameters { - fn to_marionette(&self) -> WebDriverResult> { - Ok(try_opt!( - serde_json::to_value(self)?.as_object(), - ErrorStatus::UnknownError, - "Expected an object" - ) - .clone()) - } -} - -impl ToMarionette for GetParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteUrl { - url: self.url.clone(), - }) - } -} - -impl ToMarionette for JavascriptCommandParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteScript { - script: self.script.clone(), - args: self.args.clone(), - }) - } -} - -impl ToMarionette for LocatorParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteLocator { - using: self.using.to_marionette()?, - value: self.value.clone(), - }) - } -} - -impl ToMarionette for LocatorStrategy { - fn to_marionette(&self) -> WebDriverResult { - use self::LocatorStrategy::*; - match self { - CSSSelector => Ok(MarionetteSelector::Css), - LinkText => Ok(MarionetteSelector::LinkText), - PartialLinkText => Ok(MarionetteSelector::PartialLinkText), - TagName => Ok(MarionetteSelector::TagName), - XPath => Ok(MarionetteSelector::XPath), - } - } -} - -impl ToMarionette for NewWindowParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteNewWindow { - type_hint: self.type_hint.clone(), - }) - } -} - -impl ToMarionette for SendKeysParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteKeys { - text: self.text.clone(), - value: self - .text - .chars() - .map(|x| x.to_string()) - .collect::>(), - }) - } -} - -impl ToMarionette for SwitchToFrameParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(match &self.id { - Some(x) => match x { - FrameId::Short(n) => MarionetteFrame::Index(*n), - FrameId::Element(el) => MarionetteFrame::Element(el.0.clone()), - }, - None => MarionetteFrame::Parent, - }) - } -} - -impl ToMarionette for SwitchToWindowParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(Window { - handle: self.handle.clone(), - }) - } -} - -impl ToMarionette for TimeoutsParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteTimeouts { - implicit: self.implicit, - page_load: self.page_load, - script: self.script, - }) - } -} - -impl ToMarionette for WebElement { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteWebElement { - element: self.to_string(), - }) - } -} - -impl ToMarionette for WindowRectParameters { - fn to_marionette(&self) -> WebDriverResult { - Ok(MarionetteWindowRect { - x: self.x, - y: self.y, - width: self.width, - height: self.height, - }) - } -} diff --git a/python/drivers/geckodriver-0.33.0/src/prefs.rs b/python/drivers/geckodriver-0.33.0/src/prefs.rs deleted file mode 100644 index d3c874c..0000000 --- a/python/drivers/geckodriver-0.33.0/src/prefs.rs +++ /dev/null @@ -1,158 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use mozprofile::preferences::Pref; - -// ALL CHANGES TO THIS FILE MUST HAVE REVIEW FROM A GECKODRIVER PEER! -// -// Please refer to INSTRUCTIONS TO ADD A NEW PREFERENCE in -// remote/shared/RecommendedPreferences.sys.mjs -// -// Note: geckodriver is used out-of-tree with various builds of Firefox. -// Removing a preference from this file will cause regressions, -// so please be careful and get review from a Testing :: geckodriver peer -// before you make any changes to this file. -lazy_static! { - pub static ref DEFAULT: Vec<(&'static str, Pref)> = vec![ - // Make sure Shield doesn't hit the network. - ("app.normandy.api_url", Pref::new("")), - - // Disable Firefox old build background check - ("app.update.checkInstallTime", Pref::new(false)), - - // Disable automatically upgrading Firefox - // - // Note: Possible update tests could reset or flip the value to allow - // updates to be downloaded and applied. - ("app.update.disabledForTesting", Pref::new(true)), - - // Enable the dump function, which sends messages to the system - // console - ("browser.dom.window.dump.enabled", Pref::new(true)), - ("devtools.console.stdout.chrome", Pref::new(true)), - - // Disable safebrowsing components - ("browser.safebrowsing.blockedURIs.enabled", Pref::new(false)), - ("browser.safebrowsing.downloads.enabled", Pref::new(false)), - ("browser.safebrowsing.passwords.enabled", Pref::new(false)), - ("browser.safebrowsing.malware.enabled", Pref::new(false)), - ("browser.safebrowsing.phishing.enabled", Pref::new(false)), - - // Do not restore the last open set of tabs if the browser crashed - ("browser.sessionstore.resume_from_crash", Pref::new(false)), - - // Skip check for default browser on startup - ("browser.shell.checkDefaultBrowser", Pref::new(false)), - - // Do not redirect user when a milestone upgrade of Firefox - // is detected - ("browser.startup.homepage_override.mstone", Pref::new("ignore")), - - // Start with a blank page (about:blank) - ("browser.startup.page", Pref::new(0)), - - // Disable the UI tour - ("browser.uitour.enabled", Pref::new(false)), - - // Do not warn on quitting Firefox - ("browser.warnOnQuit", Pref::new(false)), - - // Defensively disable data reporting systems - ("datareporting.healthreport.documentServerURI", Pref::new("http://%(server)s/dummy/healthreport/")), - ("datareporting.healthreport.logging.consoleEnabled", Pref::new(false)), - ("datareporting.healthreport.service.enabled", Pref::new(false)), - ("datareporting.healthreport.service.firstRun", Pref::new(false)), - ("datareporting.healthreport.uploadEnabled", Pref::new(false)), - - // Do not show datareporting policy notifications which can - // interfere with tests - ("datareporting.policy.dataSubmissionEnabled", Pref::new(false)), - ("datareporting.policy.dataSubmissionPolicyBypassNotification", Pref::new(true)), - - // Disable the ProcessHangMonitor - ("dom.ipc.reportProcessHangs", Pref::new(false)), - - // Only load extensions from the application and user profile - // AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION - ("extensions.autoDisableScopes", Pref::new(0)), - ("extensions.enabledScopes", Pref::new(5)), - - // Disable intalling any distribution extensions or add-ons - ("extensions.installDistroAddons", Pref::new(false)), - - // Turn off extension updates so they do not bother tests - ("extensions.update.enabled", Pref::new(false)), - ("extensions.update.notifyUser", Pref::new(false)), - - // Allow the application to have focus even it runs in the - // background - ("focusmanager.testmode", Pref::new(true)), - - // Disable useragent updates - ("general.useragent.updates.enabled", Pref::new(false)), - - // Always use network provider for geolocation tests so we bypass - // the macOS dialog raised by the corelocation provider - ("geo.provider.testing", Pref::new(true)), - - // Do not scan wi-fi - ("geo.wifi.scan", Pref::new(false)), - - // No hang monitor - ("hangmonitor.timeout", Pref::new(0)), - - // Disable idle-daily notifications to avoid expensive operations - // that may cause unexpected test timeouts. - ("idle.lastDailyNotification", Pref::new(-1)), - - // Disable download and usage of OpenH264, and Widevine plugins - ("media.gmp-manager.updateEnabled", Pref::new(false)), - - // Disable the GFX sanity window - ("media.sanity-test.disabled", Pref::new(true)), - - // Do not automatically switch between offline and online - ("network.manage-offline-status", Pref::new(false)), - - // Make sure SNTP requests do not hit the network - ("network.sntp.pools", Pref::new("%(server)s")), - - // Disable Flash. The plugin container it is run in is - // causing problems when quitting Firefox from geckodriver, - // c.f. https://github.com/mozilla/geckodriver/issues/225. - ("plugin.state.flash", Pref::new(0)), - - // Don't do network connections for mitm priming - ("security.certerrors.mitm.priming.enabled", Pref::new(false)), - - // Ensure blocklist updates don't hit the network - ("services.settings.server", Pref::new("")), - - // Disable first run pages - ("startup.homepage_welcome_url", Pref::new("about:blank")), - ("startup.homepage_welcome_url.additional", Pref::new("")), - - // asrouter expects a plain object or null - ("browser.newtabpage.activity-stream.asrouter.providers.cfr", Pref::new("null")), - // TODO: Remove once minimum supported Firefox release is 93. - ("browser.newtabpage.activity-stream.asrouter.providers.cfr-fxa", Pref::new("null")), - ("browser.newtabpage.activity-stream.asrouter.providers.snippets", Pref::new("null")), - ("browser.newtabpage.activity-stream.asrouter.providers.message-groups", Pref::new("null")), - ("browser.newtabpage.activity-stream.asrouter.providers.whats-new-panel", Pref::new("null")), - ("browser.newtabpage.activity-stream.asrouter.providers.messaging-experiments", Pref::new("null")), - ("browser.newtabpage.activity-stream.feeds.system.topstories", Pref::new(false)), - ("browser.newtabpage.activity-stream.feeds.snippets", Pref::new(false)), - ("browser.newtabpage.activity-stream.tippyTop.service.endpoint", Pref::new("")), - ("browser.newtabpage.activity-stream.discoverystream.config", Pref::new("[]")), - - // For Activity Stream firstrun page, use an empty string to avoid fetching. - ("browser.newtabpage.activity-stream.fxaccounts.endpoint", Pref::new("")), - - // Prevent starting into safe mode after application crashes - ("toolkit.startup.max_resumed_crashes", Pref::new(-1)), - - // Disable webapp updates. - ("browser.webapps.checkForUpdates", Pref::new(0)), - ]; -} diff --git a/python/drivers/geckodriver-0.33.0/src/test.rs b/python/drivers/geckodriver-0.33.0/src/test.rs deleted file mode 100644 index e664aad..0000000 --- a/python/drivers/geckodriver-0.33.0/src/test.rs +++ /dev/null @@ -1,12 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -pub fn assert_de(data: &T, json: serde_json::Value) -where - T: std::fmt::Debug, - T: std::cmp::PartialEq, - T: serde::de::DeserializeOwned, -{ - assert_eq!(data, &serde_json::from_value::(json).unwrap()); -} diff --git a/python/drivers/geckodriver-0.33.0/src/tests/profile.zip b/python/drivers/geckodriver-0.33.0/src/tests/profile.zip deleted file mode 100644 index 286b118..0000000 Binary files a/python/drivers/geckodriver-0.33.0/src/tests/profile.zip and /dev/null differ diff --git a/python/geckodriver-install.sh b/python/geckodriver-install.sh deleted file mode 100644 index f26fe31..0000000 --- a/python/geckodriver-install.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -INSTALL_DIR="/usr/local/bin" - -json=$(curl -s https://api.github.com/repos/mozilla/geckodriver/releases/latest) -url=$(echo "$json" | jq -r '.assets[].browser_download_url | select(contains("linux64") and endswith("gz"))') -curl -s -L "$url" | tar -xz -chmod +x geckodriver -sudo mv geckodriver "$INSTALL_DIR" -export PATH=$PATH:$INSTALL_DIR/geckodriver -echo "installed geckodriver binary in $INSTALL_DIR" \ No newline at end of file diff --git a/python/requirements.txt b/python/requirements.txt index f6f15b1..12e1aac 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -2,7 +2,6 @@ apscheduler==3.10.1 async-timeout==4.0.2 beautifulsoup4==4.12.2 Brotli==1.0.9 -bs4==0.0.1 certifi==2023.5.7 charset-normalizer==3.1.0 click==8.1.3 @@ -19,8 +18,6 @@ pysondb-v2==2.0.0 redis==4.5.5 requests==2.31.0 requests-file==1.5.1 -selenium==3.14.1 -selenium-requests==1.3 schedule==1.2.0 six==1.16.0 soupsieve==2.4.1 diff --git a/python/static/LICENSE.txt b/python/static/LICENSE.txt deleted file mode 100755 index 263df3d..0000000 --- a/python/static/LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -If you use the icons publicly, please link to https://icons8.com/line-awesome somewhere on your page or artwork, so that more creators could know about it and use it for free. \ No newline at end of file diff --git a/python/static/css/line-awesome.css b/python/static/css/line-awesome.css deleted file mode 100644 index 3e9d858..0000000 --- a/python/static/css/line-awesome.css +++ /dev/null @@ -1,6582 +0,0 @@ -.la, -.las, -.lar, -.lal, -.lad, -.lab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; } - -.la-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -.0667em; } - -.la-xs { - font-size: .75em; } - -.la-sm { - font-size: .875em; } - -.la-1x { - font-size: 1em; } - -.la-2x { - font-size: 2em; } - -.la-3x { - font-size: 3em; } - -.la-4x { - font-size: 4em; } - -.la-5x { - font-size: 5em; } - -.la-6x { - font-size: 6em; } - -.la-7x { - font-size: 7em; } - -.la-8x { - font-size: 8em; } - -.la-9x { - font-size: 9em; } - -.la-10x { - font-size: 10em; } - -.la-fw { - text-align: center; - width: 1.25em; } - -.la-ul { - list-style-type: none; - margin-left: 2.5em; - padding-left: 0; } - .la-ul > li { - position: relative; } - -.la-li { - left: -2em; - position: absolute; - text-align: center; - width: 2em; - line-height: inherit; } - -.la-border { - border: solid 0.08em #eee; - border-radius: .1em; - padding: .2em .25em .15em; } - -.la-pull-left { - float: left; } - -.la-pull-right { - float: right; } - -.la.la-pull-left, -.las.la-pull-left, -.lar.la-pull-left, -.lal.la-pull-left, -.lab.la-pull-left { - margin-right: .3em; } - -.la.la-pull-right, -.las.la-pull-right, -.lar.la-pull-right, -.lal.la-pull-right, -.lab.la-pull-right { - margin-left: .3em; } - -.la-spin { - -webkit-animation: la-spin 2s infinite linear; - animation: la-spin 2s infinite linear; } - -.la-pulse { - -webkit-animation: la-spin 1s infinite steps(8); - animation: la-spin 1s infinite steps(8); } - -@-webkit-keyframes la-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -@keyframes la-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -.la-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); } - -.la-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); } - -.la-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); } - -.la-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); } - -.la-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); } - -.la-flip-both, .la-flip-horizontal.la-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); } - -:root .la-rotate-90, -:root .la-rotate-180, -:root .la-rotate-270, -:root .la-flip-horizontal, -:root .la-flip-vertical, -:root .la-flip-both { - -webkit-filter: none; - filter: none; } - -.la-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2.5em; } - -.la-stack-1x, -.la-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; } - -.la-stack-1x { - line-height: inherit; } - -.la-stack-2x { - font-size: 2em; } - -.la-inverse { - color: #fff; } - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ -.la-500px:before { - content: "\f26e"; } - -.la-accessible-icon:before { - content: "\f368"; } - -.la-accusoft:before { - content: "\f369"; } - -.la-acquisitions-incorporated:before { - content: "\f6af"; } - -.la-ad:before { - content: "\f641"; } - -.la-address-book:before { - content: "\f2b9"; } - -.la-address-card:before { - content: "\f2bb"; } - -.la-adjust:before { - content: "\f042"; } - -.la-adn:before { - content: "\f170"; } - -.la-adobe:before { - content: "\f778"; } - -.la-adversal:before { - content: "\f36a"; } - -.la-affiliatetheme:before { - content: "\f36b"; } - -.la-air-freshener:before { - content: "\f5d0"; } - -.la-airbnb:before { - content: "\f834"; } - -.la-algolia:before { - content: "\f36c"; } - -.la-align-center:before { - content: "\f037"; } - -.la-align-justify:before { - content: "\f039"; } - -.la-align-left:before { - content: "\f036"; } - -.la-align-right:before { - content: "\f038"; } - -.la-alipay:before { - content: "\f642"; } - -.la-allergies:before { - content: "\f461"; } - -.la-amazon:before { - content: "\f270"; } - -.la-amazon-pay:before { - content: "\f42c"; } - -.la-ambulance:before { - content: "\f0f9"; } - -.la-american-sign-language-interpreting:before { - content: "\f2a3"; } - -.la-amilia:before { - content: "\f36d"; } - -.la-anchor:before { - content: "\f13d"; } - -.la-android:before { - content: "\f17b"; } - -.la-angellist:before { - content: "\f209"; } - -.la-angle-double-down:before { - content: "\f103"; } - -.la-angle-double-left:before { - content: "\f100"; } - -.la-angle-double-right:before { - content: "\f101"; } - -.la-angle-double-up:before { - content: "\f102"; } - -.la-angle-down:before { - content: "\f107"; } - -.la-angle-left:before { - content: "\f104"; } - -.la-angle-right:before { - content: "\f105"; } - -.la-angle-up:before { - content: "\f106"; } - -.la-angry:before { - content: "\f556"; } - -.la-angrycreative:before { - content: "\f36e"; } - -.la-angular:before { - content: "\f420"; } - -.la-ankh:before { - content: "\f644"; } - -.la-app-store:before { - content: "\f36f"; } - -.la-app-store-ios:before { - content: "\f370"; } - -.la-apper:before { - content: "\f371"; } - -.la-apple:before { - content: "\f179"; } - -.la-apple-alt:before { - content: "\f5d1"; } - -.la-apple-pay:before { - content: "\f415"; } - -.la-archive:before { - content: "\f187"; } - -.la-archway:before { - content: "\f557"; } - -.la-arrow-alt-circle-down:before { - content: "\f358"; } - -.la-arrow-alt-circle-left:before { - content: "\f359"; } - -.la-arrow-alt-circle-right:before { - content: "\f35a"; } - -.la-arrow-alt-circle-up:before { - content: "\f35b"; } - -.la-arrow-circle-down:before { - content: "\f0ab"; } - -.la-arrow-circle-left:before { - content: "\f0a8"; } - -.la-arrow-circle-right:before { - content: "\f0a9"; } - -.la-arrow-circle-up:before { - content: "\f0aa"; } - -.la-arrow-down:before { - content: "\f063"; } - -.la-arrow-left:before { - content: "\f060"; } - -.la-arrow-right:before { - content: "\f061"; } - -.la-arrow-up:before { - content: "\f062"; } - -.la-arrows-alt:before { - content: "\f0b2"; } - -.la-arrows-alt-h:before { - content: "\f337"; } - -.la-arrows-alt-v:before { - content: "\f338"; } - -.la-artstation:before { - content: "\f77a"; } - -.la-assistive-listening-systems:before { - content: "\f2a2"; } - -.la-asterisk:before { - content: "\f069"; } - -.la-asymmetrik:before { - content: "\f372"; } - -.la-at:before { - content: "\f1fa"; } - -.la-atlas:before { - content: "\f558"; } - -.la-atlassian:before { - content: "\f77b"; } - -.la-atom:before { - content: "\f5d2"; } - -.la-audible:before { - content: "\f373"; } - -.la-audio-description:before { - content: "\f29e"; } - -.la-autoprefixer:before { - content: "\f41c"; } - -.la-avianex:before { - content: "\f374"; } - -.la-aviato:before { - content: "\f421"; } - -.la-award:before { - content: "\f559"; } - -.la-aws:before { - content: "\f375"; } - -.la-baby:before { - content: "\f77c"; } - -.la-baby-carriage:before { - content: "\f77d"; } - -.la-backspace:before { - content: "\f55a"; } - -.la-backward:before { - content: "\f04a"; } - -.la-bacon:before { - content: "\f7e5"; } - -.la-balance-scale:before { - content: "\f24e"; } - -.la-balance-scale-left:before { - content: "\f515"; } - -.la-balance-scale-right:before { - content: "\f516"; } - -.la-ban:before { - content: "\f05e"; } - -.la-band-aid:before { - content: "\f462"; } - -.la-bandcamp:before { - content: "\f2d5"; } - -.la-barcode:before { - content: "\f02a"; } - -.la-bars:before { - content: "\f0c9"; } - -.la-baseball-ball:before { - content: "\f433"; } - -.la-basketball-ball:before { - content: "\f434"; } - -.la-bath:before { - content: "\f2cd"; } - -.la-battery-empty:before { - content: "\f244"; } - -.la-battery-full:before { - content: "\f240"; } - -.la-battery-half:before { - content: "\f242"; } - -.la-battery-quarter:before { - content: "\f243"; } - -.la-battery-three-quarters:before { - content: "\f241"; } - -.la-battle-net:before { - content: "\f835"; } - -.la-bed:before { - content: "\f236"; } - -.la-beer:before { - content: "\f0fc"; } - -.la-behance:before { - content: "\f1b4"; } - -.la-behance-square:before { - content: "\f1b5"; } - -.la-bell:before { - content: "\f0f3"; } - -.la-bell-slash:before { - content: "\f1f6"; } - -.la-bezier-curve:before { - content: "\f55b"; } - -.la-bible:before { - content: "\f647"; } - -.la-bicycle:before { - content: "\f206"; } - -.la-biking:before { - content: "\f84a"; } - -.la-bimobject:before { - content: "\f378"; } - -.la-binoculars:before { - content: "\f1e5"; } - -.la-biohazard:before { - content: "\f780"; } - -.la-birthday-cake:before { - content: "\f1fd"; } - -.la-bitbucket:before { - content: "\f171"; } - -.la-bitcoin:before { - content: "\f379"; } - -.la-bity:before { - content: "\f37a"; } - -.la-black-tie:before { - content: "\f27e"; } - -.la-blackberry:before { - content: "\f37b"; } - -.la-blender:before { - content: "\f517"; } - -.la-blender-phone:before { - content: "\f6b6"; } - -.la-blind:before { - content: "\f29d"; } - -.la-blog:before { - content: "\f781"; } - -.la-blogger:before { - content: "\f37c"; } - -.la-blogger-b:before { - content: "\f37d"; } - -.la-bluetooth:before { - content: "\f293"; } - -.la-bluetooth-b:before { - content: "\f294"; } - -.la-bold:before { - content: "\f032"; } - -.la-bolt:before { - content: "\f0e7"; } - -.la-bomb:before { - content: "\f1e2"; } - -.la-bone:before { - content: "\f5d7"; } - -.la-bong:before { - content: "\f55c"; } - -.la-book:before { - content: "\f02d"; } - -.la-book-dead:before { - content: "\f6b7"; } - -.la-book-medical:before { - content: "\f7e6"; } - -.la-book-open:before { - content: "\f518"; } - -.la-book-reader:before { - content: "\f5da"; } - -.la-bookmark:before { - content: "\f02e"; } - -.la-bootstrap:before { - content: "\f836"; } - -.la-border-all:before { - content: "\f84c"; } - -.la-border-none:before { - content: "\f850"; } - -.la-border-style:before { - content: "\f853"; } - -.la-bowling-ball:before { - content: "\f436"; } - -.la-box:before { - content: "\f466"; } - -.la-box-open:before { - content: "\f49e"; } - -.la-boxes:before { - content: "\f468"; } - -.la-braille:before { - content: "\f2a1"; } - -.la-brain:before { - content: "\f5dc"; } - -.la-bread-slice:before { - content: "\f7ec"; } - -.la-briefcase:before { - content: "\f0b1"; } - -.la-briefcase-medical:before { - content: "\f469"; } - -.la-broadcast-tower:before { - content: "\f519"; } - -.la-broom:before { - content: "\f51a"; } - -.la-brush:before { - content: "\f55d"; } - -.la-btc:before { - content: "\f15a"; } - -.la-buffer:before { - content: "\f837"; } - -.la-bug:before { - content: "\f188"; } - -.la-building:before { - content: "\f1ad"; } - -.la-bullhorn:before { - content: "\f0a1"; } - -.la-bullseye:before { - content: "\f140"; } - -.la-burn:before { - content: "\f46a"; } - -.la-buromobelexperte:before { - content: "\f37f"; } - -.la-bus:before { - content: "\f207"; } - -.la-bus-alt:before { - content: "\f55e"; } - -.la-business-time:before { - content: "\f64a"; } - -.la-buy-n-large:before { - content: "\f8a6"; } - -.la-buysellads:before { - content: "\f20d"; } - -.la-calculator:before { - content: "\f1ec"; } - -.la-calendar:before { - content: "\f133"; } - -.la-calendar-alt:before { - content: "\f073"; } - -.la-calendar-check:before { - content: "\f274"; } - -.la-calendar-day:before { - content: "\f783"; } - -.la-calendar-minus:before { - content: "\f272"; } - -.la-calendar-plus:before { - content: "\f271"; } - -.la-calendar-times:before { - content: "\f273"; } - -.la-calendar-week:before { - content: "\f784"; } - -.la-camera:before { - content: "\f030"; } - -.la-camera-retro:before { - content: "\f083"; } - -.la-campground:before { - content: "\f6bb"; } - -.la-canadian-maple-leaf:before { - content: "\f785"; } - -.la-candy-cane:before { - content: "\f786"; } - -.la-cannabis:before { - content: "\f55f"; } - -.la-capsules:before { - content: "\f46b"; } - -.la-car:before { - content: "\f1b9"; } - -.la-car-alt:before { - content: "\f5de"; } - -.la-car-battery:before { - content: "\f5df"; } - -.la-car-crash:before { - content: "\f5e1"; } - -.la-car-side:before { - content: "\f5e4"; } - -.la-caret-down:before { - content: "\f0d7"; } - -.la-caret-left:before { - content: "\f0d9"; } - -.la-caret-right:before { - content: "\f0da"; } - -.la-caret-square-down:before { - content: "\f150"; } - -.la-caret-square-left:before { - content: "\f191"; } - -.la-caret-square-right:before { - content: "\f152"; } - -.la-caret-square-up:before { - content: "\f151"; } - -.la-caret-up:before { - content: "\f0d8"; } - -.la-carrot:before { - content: "\f787"; } - -.la-cart-arrow-down:before { - content: "\f218"; } - -.la-cart-plus:before { - content: "\f217"; } - -.la-cash-register:before { - content: "\f788"; } - -.la-cat:before { - content: "\f6be"; } - -.la-cc-amazon-pay:before { - content: "\f42d"; } - -.la-cc-amex:before { - content: "\f1f3"; } - -.la-cc-apple-pay:before { - content: "\f416"; } - -.la-cc-diners-club:before { - content: "\f24c"; } - -.la-cc-discover:before { - content: "\f1f2"; } - -.la-cc-jcb:before { - content: "\f24b"; } - -.la-cc-mastercard:before { - content: "\f1f1"; } - -.la-cc-paypal:before { - content: "\f1f4"; } - -.la-cc-stripe:before { - content: "\f1f5"; } - -.la-cc-visa:before { - content: "\f1f0"; } - -.la-centercode:before { - content: "\f380"; } - -.la-centos:before { - content: "\f789"; } - -.la-certificate:before { - content: "\f0a3"; } - -.la-chair:before { - content: "\f6c0"; } - -.la-chalkboard:before { - content: "\f51b"; } - -.la-chalkboard-teacher:before { - content: "\f51c"; } - -.la-charging-station:before { - content: "\f5e7"; } - -.la-chart-area:before { - content: "\f1fe"; } - -.la-chart-bar:before { - content: "\f080"; } - -.la-chart-line:before { - content: "\f201"; } - -.la-chart-pie:before { - content: "\f200"; } - -.la-check:before { - content: "\f00c"; } - -.la-check-circle:before { - content: "\f058"; } - -.la-check-double:before { - content: "\f560"; } - -.la-check-square:before { - content: "\f14a"; } - -.la-cheese:before { - content: "\f7ef"; } - -.la-chess:before { - content: "\f439"; } - -.la-chess-bishop:before { - content: "\f43a"; } - -.la-chess-board:before { - content: "\f43c"; } - -.la-chess-king:before { - content: "\f43f"; } - -.la-chess-knight:before { - content: "\f441"; } - -.la-chess-pawn:before { - content: "\f443"; } - -.la-chess-queen:before { - content: "\f445"; } - -.la-chess-rook:before { - content: "\f447"; } - -.la-chevron-circle-down:before { - content: "\f13a"; } - -.la-chevron-circle-left:before { - content: "\f137"; } - -.la-chevron-circle-right:before { - content: "\f138"; } - -.la-chevron-circle-up:before { - content: "\f139"; } - -.la-chevron-down:before { - content: "\f078"; } - -.la-chevron-left:before { - content: "\f053"; } - -.la-chevron-right:before { - content: "\f054"; } - -.la-chevron-up:before { - content: "\f077"; } - -.la-child:before { - content: "\f1ae"; } - -.la-chrome:before { - content: "\f268"; } - -.la-chromecast:before { - content: "\f838"; } - -.la-church:before { - content: "\f51d"; } - -.la-circle:before { - content: "\f111"; } - -.la-circle-notch:before { - content: "\f1ce"; } - -.la-city:before { - content: "\f64f"; } - -.la-clinic-medical:before { - content: "\f7f2"; } - -.la-clipboard:before { - content: "\f328"; } - -.la-clipboard-check:before { - content: "\f46c"; } - -.la-clipboard-list:before { - content: "\f46d"; } - -.la-clock:before { - content: "\f017"; } - -.la-clone:before { - content: "\f24d"; } - -.la-closed-captioning:before { - content: "\f20a"; } - -.la-cloud:before { - content: "\f0c2"; } - -.la-cloud-download-alt:before { - content: "\f381"; } - -.la-cloud-meatball:before { - content: "\f73b"; } - -.la-cloud-moon:before { - content: "\f6c3"; } - -.la-cloud-moon-rain:before { - content: "\f73c"; } - -.la-cloud-rain:before { - content: "\f73d"; } - -.la-cloud-showers-heavy:before { - content: "\f740"; } - -.la-cloud-sun:before { - content: "\f6c4"; } - -.la-cloud-sun-rain:before { - content: "\f743"; } - -.la-cloud-upload-alt:before { - content: "\f382"; } - -.la-cloudscale:before { - content: "\f383"; } - -.la-cloudsmith:before { - content: "\f384"; } - -.la-cloudversify:before { - content: "\f385"; } - -.la-cocktail:before { - content: "\f561"; } - -.la-code:before { - content: "\f121"; } - -.la-code-branch:before { - content: "\f126"; } - -.la-codepen:before { - content: "\f1cb"; } - -.la-codiepie:before { - content: "\f284"; } - -.la-coffee:before { - content: "\f0f4"; } - -.la-cog:before { - content: "\f013"; } - -.la-cogs:before { - content: "\f085"; } - -.la-coins:before { - content: "\f51e"; } - -.la-columns:before { - content: "\f0db"; } - -.la-comment:before { - content: "\f075"; } - -.la-comment-alt:before { - content: "\f27a"; } - -.la-comment-dollar:before { - content: "\f651"; } - -.la-comment-dots:before { - content: "\f4ad"; } - -.la-comment-medical:before { - content: "\f7f5"; } - -.la-comment-slash:before { - content: "\f4b3"; } - -.la-comments:before { - content: "\f086"; } - -.la-comments-dollar:before { - content: "\f653"; } - -.la-compact-disc:before { - content: "\f51f"; } - -.la-compass:before { - content: "\f14e"; } - -.la-compress:before { - content: "\f066"; } - -.la-compress-arrows-alt:before { - content: "\f78c"; } - -.la-concierge-bell:before { - content: "\f562"; } - -.la-confluence:before { - content: "\f78d"; } - -.la-connectdevelop:before { - content: "\f20e"; } - -.la-contao:before { - content: "\f26d"; } - -.la-cookie:before { - content: "\f563"; } - -.la-cookie-bite:before { - content: "\f564"; } - -.la-copy:before { - content: "\f0c5"; } - -.la-copyright:before { - content: "\f1f9"; } - -.la-cotton-bureau:before { - content: "\f89e"; } - -.la-couch:before { - content: "\f4b8"; } - -.la-cpanel:before { - content: "\f388"; } - -.la-creative-commons:before { - content: "\f25e"; } - -.la-creative-commons-by:before { - content: "\f4e7"; } - -.la-creative-commons-nc:before { - content: "\f4e8"; } - -.la-creative-commons-nc-eu:before { - content: "\f4e9"; } - -.la-creative-commons-nc-jp:before { - content: "\f4ea"; } - -.la-creative-commons-nd:before { - content: "\f4eb"; } - -.la-creative-commons-pd:before { - content: "\f4ec"; } - -.la-creative-commons-pd-alt:before { - content: "\f4ed"; } - -.la-creative-commons-remix:before { - content: "\f4ee"; } - -.la-creative-commons-sa:before { - content: "\f4ef"; } - -.la-creative-commons-sampling:before { - content: "\f4f0"; } - -.la-creative-commons-sampling-plus:before { - content: "\f4f1"; } - -.la-creative-commons-share:before { - content: "\f4f2"; } - -.la-creative-commons-zero:before { - content: "\f4f3"; } - -.la-credit-card:before { - content: "\f09d"; } - -.la-critical-role:before { - content: "\f6c9"; } - -.la-crop:before { - content: "\f125"; } - -.la-crop-alt:before { - content: "\f565"; } - -.la-cross:before { - content: "\f654"; } - -.la-crosshairs:before { - content: "\f05b"; } - -.la-crow:before { - content: "\f520"; } - -.la-crown:before { - content: "\f521"; } - -.la-crutch:before { - content: "\f7f7"; } - -.la-css3:before { - content: "\f13c"; } - -.la-css3-alt:before { - content: "\f38b"; } - -.la-cube:before { - content: "\f1b2"; } - -.la-cubes:before { - content: "\f1b3"; } - -.la-cut:before { - content: "\f0c4"; } - -.la-cuttlefish:before { - content: "\f38c"; } - -.la-d-and-d:before { - content: "\f38d"; } - -.la-d-and-d-beyond:before { - content: "\f6ca"; } - -.la-dashcube:before { - content: "\f210"; } - -.la-database:before { - content: "\f1c0"; } - -.la-deaf:before { - content: "\f2a4"; } - -.la-delicious:before { - content: "\f1a5"; } - -.la-democrat:before { - content: "\f747"; } - -.la-deploydog:before { - content: "\f38e"; } - -.la-deskpro:before { - content: "\f38f"; } - -.la-desktop:before { - content: "\f108"; } - -.la-dev:before { - content: "\f6cc"; } - -.la-deviantart:before { - content: "\f1bd"; } - -.la-dharmachakra:before { - content: "\f655"; } - -.la-dhl:before { - content: "\f790"; } - -.la-diagnoses:before { - content: "\f470"; } - -.la-diaspora:before { - content: "\f791"; } - -.la-dice:before { - content: "\f522"; } - -.la-dice-d20:before { - content: "\f6cf"; } - -.la-dice-d6:before { - content: "\f6d1"; } - -.la-dice-five:before { - content: "\f523"; } - -.la-dice-four:before { - content: "\f524"; } - -.la-dice-one:before { - content: "\f525"; } - -.la-dice-six:before { - content: "\f526"; } - -.la-dice-three:before { - content: "\f527"; } - -.la-dice-two:before { - content: "\f528"; } - -.la-digg:before { - content: "\f1a6"; } - -.la-digital-ocean:before { - content: "\f391"; } - -.la-digital-tachograph:before { - content: "\f566"; } - -.la-directions:before { - content: "\f5eb"; } - -.la-discord:before { - content: "\f392"; } - -.la-discourse:before { - content: "\f393"; } - -.la-divide:before { - content: "\f529"; } - -.la-dizzy:before { - content: "\f567"; } - -.la-dna:before { - content: "\f471"; } - -.la-dochub:before { - content: "\f394"; } - -.la-docker:before { - content: "\f395"; } - -.la-dog:before { - content: "\f6d3"; } - -.la-dollar-sign:before { - content: "\f155"; } - -.la-dolly:before { - content: "\f472"; } - -.la-dolly-flatbed:before { - content: "\f474"; } - -.la-donate:before { - content: "\f4b9"; } - -.la-door-closed:before { - content: "\f52a"; } - -.la-door-open:before { - content: "\f52b"; } - -.la-dot-circle:before { - content: "\f192"; } - -.la-dove:before { - content: "\f4ba"; } - -.la-download:before { - content: "\f019"; } - -.la-draft2digital:before { - content: "\f396"; } - -.la-drafting-compass:before { - content: "\f568"; } - -.la-dragon:before { - content: "\f6d5"; } - -.la-draw-polygon:before { - content: "\f5ee"; } - -.la-dribbble:before { - content: "\f17d"; } - -.la-dribbble-square:before { - content: "\f397"; } - -.la-dropbox:before { - content: "\f16b"; } - -.la-drum:before { - content: "\f569"; } - -.la-drum-steelpan:before { - content: "\f56a"; } - -.la-drumstick-bite:before { - content: "\f6d7"; } - -.la-drupal:before { - content: "\f1a9"; } - -.la-dumbbell:before { - content: "\f44b"; } - -.la-dumpster:before { - content: "\f793"; } - -.la-dumpster-fire:before { - content: "\f794"; } - -.la-dungeon:before { - content: "\f6d9"; } - -.la-dyalog:before { - content: "\f399"; } - -.la-earlybirds:before { - content: "\f39a"; } - -.la-ebay:before { - content: "\f4f4"; } - -.la-edge:before { - content: "\f282"; } - -.la-edit:before { - content: "\f044"; } - -.la-egg:before { - content: "\f7fb"; } - -.la-eject:before { - content: "\f052"; } - -.la-elementor:before { - content: "\f430"; } - -.la-ellipsis-h:before { - content: "\f141"; } - -.la-ellipsis-v:before { - content: "\f142"; } - -.la-ello:before { - content: "\f5f1"; } - -.la-ember:before { - content: "\f423"; } - -.la-empire:before { - content: "\f1d1"; } - -.la-envelope:before { - content: "\f0e0"; } - -.la-envelope-open:before { - content: "\f2b6"; } - -.la-envelope-open-text:before { - content: "\f658"; } - -.la-envelope-square:before { - content: "\f199"; } - -.la-envira:before { - content: "\f299"; } - -.la-equals:before { - content: "\f52c"; } - -.la-eraser:before { - content: "\f12d"; } - -.la-erlang:before { - content: "\f39d"; } - -.la-ethereum:before { - content: "\f42e"; } - -.la-ethernet:before { - content: "\f796"; } - -.la-etsy:before { - content: "\f2d7"; } - -.la-euro-sign:before { - content: "\f153"; } - -.la-evernote:before { - content: "\f839"; } - -.la-exchange-alt:before { - content: "\f362"; } - -.la-exclamation:before { - content: "\f12a"; } - -.la-exclamation-circle:before { - content: "\f06a"; } - -.la-exclamation-triangle:before { - content: "\f071"; } - -.la-expand:before { - content: "\f065"; } - -.la-expand-arrows-alt:before { - content: "\f31e"; } - -.la-expeditedssl:before { - content: "\f23e"; } - -.la-external-link-alt:before { - content: "\f35d"; } - -.la-external-link-square-alt:before { - content: "\f360"; } - -.la-eye:before { - content: "\f06e"; } - -.la-eye-dropper:before { - content: "\f1fb"; } - -.la-eye-slash:before { - content: "\f070"; } - -.la-facebook:before { - content: "\f09a"; } - -.la-facebook-f:before { - content: "\f39e"; } - -.la-facebook-messenger:before { - content: "\f39f"; } - -.la-facebook-square:before { - content: "\f082"; } - -.la-fan:before { - content: "\f863"; } - -.la-fantasy-flight-games:before { - content: "\f6dc"; } - -.la-fast-backward:before { - content: "\f049"; } - -.la-fast-forward:before { - content: "\f050"; } - -.la-fax:before { - content: "\f1ac"; } - -.la-feather:before { - content: "\f52d"; } - -.la-feather-alt:before { - content: "\f56b"; } - -.la-fedex:before { - content: "\f797"; } - -.la-fedora:before { - content: "\f798"; } - -.la-female:before { - content: "\f182"; } - -.la-fighter-jet:before { - content: "\f0fb"; } - -.la-figma:before { - content: "\f799"; } - -.la-file:before { - content: "\f15b"; } - -.la-file-alt:before { - content: "\f15c"; } - -.la-file-archive:before { - content: "\f1c6"; } - -.la-file-audio:before { - content: "\f1c7"; } - -.la-file-code:before { - content: "\f1c9"; } - -.la-file-contract:before { - content: "\f56c"; } - -.la-file-csv:before { - content: "\f6dd"; } - -.la-file-download:before { - content: "\f56d"; } - -.la-file-excel:before { - content: "\f1c3"; } - -.la-file-export:before { - content: "\f56e"; } - -.la-file-image:before { - content: "\f1c5"; } - -.la-file-import:before { - content: "\f56f"; } - -.la-file-invoice:before { - content: "\f570"; } - -.la-file-invoice-dollar:before { - content: "\f571"; } - -.la-file-medical:before { - content: "\f477"; } - -.la-file-medical-alt:before { - content: "\f478"; } - -.la-file-pdf:before { - content: "\f1c1"; } - -.la-file-powerpoint:before { - content: "\f1c4"; } - -.la-file-prescription:before { - content: "\f572"; } - -.la-file-signature:before { - content: "\f573"; } - -.la-file-upload:before { - content: "\f574"; } - -.la-file-video:before { - content: "\f1c8"; } - -.la-file-word:before { - content: "\f1c2"; } - -.la-fill:before { - content: "\f575"; } - -.la-fill-drip:before { - content: "\f576"; } - -.la-film:before { - content: "\f008"; } - -.la-filter:before { - content: "\f0b0"; } - -.la-fingerprint:before { - content: "\f577"; } - -.la-fire:before { - content: "\f06d"; } - -.la-fire-alt:before { - content: "\f7e4"; } - -.la-fire-extinguisher:before { - content: "\f134"; } - -.la-firefox:before { - content: "\f269"; } - -.la-first-aid:before { - content: "\f479"; } - -.la-first-order:before { - content: "\f2b0"; } - -.la-first-order-alt:before { - content: "\f50a"; } - -.la-firstdraft:before { - content: "\f3a1"; } - -.la-fish:before { - content: "\f578"; } - -.la-fist-raised:before { - content: "\f6de"; } - -.la-flag:before { - content: "\f024"; } - -.la-flag-checkered:before { - content: "\f11e"; } - -.la-flag-usa:before { - content: "\f74d"; } - -.la-flask:before { - content: "\f0c3"; } - -.la-flickr:before { - content: "\f16e"; } - -.la-flipboard:before { - content: "\f44d"; } - -.la-flushed:before { - content: "\f579"; } - -.la-fly:before { - content: "\f417"; } - -.la-folder:before { - content: "\f07b"; } - -.la-folder-minus:before { - content: "\f65d"; } - -.la-folder-open:before { - content: "\f07c"; } - -.la-folder-plus:before { - content: "\f65e"; } - -.la-font:before { - content: "\f031"; } - -.la-font-awesome:before { - content: "\f2b4"; } - -.la-font-awesome-alt:before { - content: "\f35c"; } - -.la-font-awesome-flag:before { - content: "\f425"; } - -.la-font-awesome-logo-full:before { - content: "\f4e6"; } - -.la-fonticons:before { - content: "\f280"; } - -.la-fonticons-fi:before { - content: "\f3a2"; } - -.la-football-ball:before { - content: "\f44e"; } - -.la-fort-awesome:before { - content: "\f286"; } - -.la-fort-awesome-alt:before { - content: "\f3a3"; } - -.la-forumbee:before { - content: "\f211"; } - -.la-forward:before { - content: "\f04e"; } - -.la-foursquare:before { - content: "\f180"; } - -.la-free-code-camp:before { - content: "\f2c5"; } - -.la-freebsd:before { - content: "\f3a4"; } - -.la-frog:before { - content: "\f52e"; } - -.la-frown:before { - content: "\f119"; } - -.la-frown-open:before { - content: "\f57a"; } - -.la-fulcrum:before { - content: "\f50b"; } - -.la-funnel-dollar:before { - content: "\f662"; } - -.la-futbol:before { - content: "\f1e3"; } - -.la-galactic-republic:before { - content: "\f50c"; } - -.la-galactic-senate:before { - content: "\f50d"; } - -.la-gamepad:before { - content: "\f11b"; } - -.la-gas-pump:before { - content: "\f52f"; } - -.la-gavel:before { - content: "\f0e3"; } - -.la-gem:before { - content: "\f3a5"; } - -.la-genderless:before { - content: "\f22d"; } - -.la-get-pocket:before { - content: "\f265"; } - -.la-gg:before { - content: "\f260"; } - -.la-gg-circle:before { - content: "\f261"; } - -.la-ghost:before { - content: "\f6e2"; } - -.la-gift:before { - content: "\f06b"; } - -.la-gifts:before { - content: "\f79c"; } - -.la-git:before { - content: "\f1d3"; } - -.la-git-alt:before { - content: "\f841"; } - -.la-git-square:before { - content: "\f1d2"; } - -.la-github:before { - content: "\f09b"; } - -.la-github-alt:before { - content: "\f113"; } - -.la-github-square:before { - content: "\f092"; } - -.la-gitkraken:before { - content: "\f3a6"; } - -.la-gitlab:before { - content: "\f296"; } - -.la-gitter:before { - content: "\f426"; } - -.la-glass-cheers:before { - content: "\f79f"; } - -.la-glass-martini:before { - content: "\f000"; } - -.la-glass-martini-alt:before { - content: "\f57b"; } - -.la-glass-whiskey:before { - content: "\f7a0"; } - -.la-glasses:before { - content: "\f530"; } - -.la-glide:before { - content: "\f2a5"; } - -.la-glide-g:before { - content: "\f2a6"; } - -.la-globe:before { - content: "\f0ac"; } - -.la-globe-africa:before { - content: "\f57c"; } - -.la-globe-americas:before { - content: "\f57d"; } - -.la-globe-asia:before { - content: "\f57e"; } - -.la-globe-europe:before { - content: "\f7a2"; } - -.la-gofore:before { - content: "\f3a7"; } - -.la-golf-ball:before { - content: "\f450"; } - -.la-goodreads:before { - content: "\f3a8"; } - -.la-goodreads-g:before { - content: "\f3a9"; } - -.la-google:before { - content: "\f1a0"; } - -.la-google-drive:before { - content: "\f3aa"; } - -.la-google-play:before { - content: "\f3ab"; } - -.la-google-plus:before { - content: "\f2b3"; } - -.la-google-plus-g:before { - content: "\f0d5"; } - -.la-google-plus-square:before { - content: "\f0d4"; } - -.la-google-wallet:before { - content: "\f1ee"; } - -.la-gopuram:before { - content: "\f664"; } - -.la-graduation-cap:before { - content: "\f19d"; } - -.la-gratipay:before { - content: "\f184"; } - -.la-grav:before { - content: "\f2d6"; } - -.la-greater-than:before { - content: "\f531"; } - -.la-greater-than-equal:before { - content: "\f532"; } - -.la-grimace:before { - content: "\f57f"; } - -.la-grin:before { - content: "\f580"; } - -.la-grin-alt:before { - content: "\f581"; } - -.la-grin-beam:before { - content: "\f582"; } - -.la-grin-beam-sweat:before { - content: "\f583"; } - -.la-grin-hearts:before { - content: "\f584"; } - -.la-grin-squint:before { - content: "\f585"; } - -.la-grin-squint-tears:before { - content: "\f586"; } - -.la-grin-stars:before { - content: "\f587"; } - -.la-grin-tears:before { - content: "\f588"; } - -.la-grin-tongue:before { - content: "\f589"; } - -.la-grin-tongue-squint:before { - content: "\f58a"; } - -.la-grin-tongue-wink:before { - content: "\f58b"; } - -.la-grin-wink:before { - content: "\f58c"; } - -.la-grip-horizontal:before { - content: "\f58d"; } - -.la-grip-lines:before { - content: "\f7a4"; } - -.la-grip-lines-vertical:before { - content: "\f7a5"; } - -.la-grip-vertical:before { - content: "\f58e"; } - -.la-gripfire:before { - content: "\f3ac"; } - -.la-grunt:before { - content: "\f3ad"; } - -.la-guitar:before { - content: "\f7a6"; } - -.la-gulp:before { - content: "\f3ae"; } - -.la-h-square:before { - content: "\f0fd"; } - -.la-hacker-news:before { - content: "\f1d4"; } - -.la-hacker-news-square:before { - content: "\f3af"; } - -.la-hackerrank:before { - content: "\f5f7"; } - -.la-hamburger:before { - content: "\f805"; } - -.la-hammer:before { - content: "\f6e3"; } - -.la-hamsa:before { - content: "\f665"; } - -.la-hand-holding:before { - content: "\f4bd"; } - -.la-hand-holding-heart:before { - content: "\f4be"; } - -.la-hand-holding-usd:before { - content: "\f4c0"; } - -.la-hand-lizard:before { - content: "\f258"; } - -.la-hand-middle-finger:before { - content: "\f806"; } - -.la-hand-paper:before { - content: "\f256"; } - -.la-hand-peace:before { - content: "\f25b"; } - -.la-hand-point-down:before { - content: "\f0a7"; } - -.la-hand-point-left:before { - content: "\f0a5"; } - -.la-hand-point-right:before { - content: "\f0a4"; } - -.la-hand-point-up:before { - content: "\f0a6"; } - -.la-hand-pointer:before { - content: "\f25a"; } - -.la-hand-rock:before { - content: "\f255"; } - -.la-hand-scissors:before { - content: "\f257"; } - -.la-hand-spock:before { - content: "\f259"; } - -.la-hands:before { - content: "\f4c2"; } - -.la-hands-helping:before { - content: "\f4c4"; } - -.la-handshake:before { - content: "\f2b5"; } - -.la-hanukiah:before { - content: "\f6e6"; } - -.la-hard-hat:before { - content: "\f807"; } - -.la-hashtag:before { - content: "\f292"; } - -.la-hat-cowboy:before { - content: "\f8c0"; } - -.la-hat-cowboy-side:before { - content: "\f8c1"; } - -.la-hat-wizard:before { - content: "\f6e8"; } - -.la-haykal:before { - content: "\f666"; } - -.la-hdd:before { - content: "\f0a0"; } - -.la-heading:before { - content: "\f1dc"; } - -.la-headphones:before { - content: "\f025"; } - -.la-headphones-alt:before { - content: "\f58f"; } - -.la-headset:before { - content: "\f590"; } - -.la-heart:before { - content: "\f004"; } - -.la-heart-broken:before { - content: "\f7a9"; } - -.la-heartbeat:before { - content: "\f21e"; } - -.la-helicopter:before { - content: "\f533"; } - -.la-highlighter:before { - content: "\f591"; } - -.la-hiking:before { - content: "\f6ec"; } - -.la-hippo:before { - content: "\f6ed"; } - -.la-hips:before { - content: "\f452"; } - -.la-hire-a-helper:before { - content: "\f3b0"; } - -.la-history:before { - content: "\f1da"; } - -.la-hockey-puck:before { - content: "\f453"; } - -.la-holly-berry:before { - content: "\f7aa"; } - -.la-home:before { - content: "\f015"; } - -.la-hooli:before { - content: "\f427"; } - -.la-hornbill:before { - content: "\f592"; } - -.la-horse:before { - content: "\f6f0"; } - -.la-horse-head:before { - content: "\f7ab"; } - -.la-hospital:before { - content: "\f0f8"; } - -.la-hospital-alt:before { - content: "\f47d"; } - -.la-hospital-symbol:before { - content: "\f47e"; } - -.la-hot-tub:before { - content: "\f593"; } - -.la-hotdog:before { - content: "\f80f"; } - -.la-hotel:before { - content: "\f594"; } - -.la-hotjar:before { - content: "\f3b1"; } - -.la-hourglass:before { - content: "\f254"; } - -.la-hourglass-end:before { - content: "\f253"; } - -.la-hourglass-half:before { - content: "\f252"; } - -.la-hourglass-start:before { - content: "\f251"; } - -.la-house-damage:before { - content: "\f6f1"; } - -.la-houzz:before { - content: "\f27c"; } - -.la-hryvnia:before { - content: "\f6f2"; } - -.la-html5:before { - content: "\f13b"; } - -.la-hubspot:before { - content: "\f3b2"; } - -.la-i-cursor:before { - content: "\f246"; } - -.la-ice-cream:before { - content: "\f810"; } - -.la-icicles:before { - content: "\f7ad"; } - -.la-icons:before { - content: "\f86d"; } - -.la-id-badge:before { - content: "\f2c1"; } - -.la-id-card:before { - content: "\f2c2"; } - -.la-id-card-alt:before { - content: "\f47f"; } - -.la-igloo:before { - content: "\f7ae"; } - -.la-image:before { - content: "\f03e"; } - -.la-images:before { - content: "\f302"; } - -.la-imdb:before { - content: "\f2d8"; } - -.la-inbox:before { - content: "\f01c"; } - -.la-indent:before { - content: "\f03c"; } - -.la-industry:before { - content: "\f275"; } - -.la-infinity:before { - content: "\f534"; } - -.la-info:before { - content: "\f129"; } - -.la-info-circle:before { - content: "\f05a"; } - -.la-instagram:before { - content: "\f16d"; } - -.la-intercom:before { - content: "\f7af"; } - -.la-internet-explorer:before { - content: "\f26b"; } - -.la-invision:before { - content: "\f7b0"; } - -.la-ioxhost:before { - content: "\f208"; } - -.la-italic:before { - content: "\f033"; } - -.la-itch-io:before { - content: "\f83a"; } - -.la-itunes:before { - content: "\f3b4"; } - -.la-itunes-note:before { - content: "\f3b5"; } - -.la-java:before { - content: "\f4e4"; } - -.la-jedi:before { - content: "\f669"; } - -.la-jedi-order:before { - content: "\f50e"; } - -.la-jenkins:before { - content: "\f3b6"; } - -.la-jira:before { - content: "\f7b1"; } - -.la-joget:before { - content: "\f3b7"; } - -.la-joint:before { - content: "\f595"; } - -.la-joomla:before { - content: "\f1aa"; } - -.la-journal-whills:before { - content: "\f66a"; } - -.la-js:before { - content: "\f3b8"; } - -.la-js-square:before { - content: "\f3b9"; } - -.la-jsfiddle:before { - content: "\f1cc"; } - -.la-kaaba:before { - content: "\f66b"; } - -.la-kaggle:before { - content: "\f5fa"; } - -.la-key:before { - content: "\f084"; } - -.la-keybase:before { - content: "\f4f5"; } - -.la-keyboard:before { - content: "\f11c"; } - -.la-keycdn:before { - content: "\f3ba"; } - -.la-khanda:before { - content: "\f66d"; } - -.la-kickstarter:before { - content: "\f3bb"; } - -.la-kickstarter-k:before { - content: "\f3bc"; } - -.la-kiss:before { - content: "\f596"; } - -.la-kiss-beam:before { - content: "\f597"; } - -.la-kiss-wink-heart:before { - content: "\f598"; } - -.la-kiwi-bird:before { - content: "\f535"; } - -.la-korvue:before { - content: "\f42f"; } - -.la-landmark:before { - content: "\f66f"; } - -.la-language:before { - content: "\f1ab"; } - -.la-laptop:before { - content: "\f109"; } - -.la-laptop-code:before { - content: "\f5fc"; } - -.la-laptop-medical:before { - content: "\f812"; } - -.la-laravel:before { - content: "\f3bd"; } - -.la-lastfm:before { - content: "\f202"; } - -.la-lastfm-square:before { - content: "\f203"; } - -.la-laugh:before { - content: "\f599"; } - -.la-laugh-beam:before { - content: "\f59a"; } - -.la-laugh-squint:before { - content: "\f59b"; } - -.la-laugh-wink:before { - content: "\f59c"; } - -.la-layer-group:before { - content: "\f5fd"; } - -.la-leaf:before { - content: "\f06c"; } - -.la-leanpub:before { - content: "\f212"; } - -.la-lemon:before { - content: "\f094"; } - -.la-less:before { - content: "\f41d"; } - -.la-less-than:before { - content: "\f536"; } - -.la-less-than-equal:before { - content: "\f537"; } - -.la-level-down-alt:before { - content: "\f3be"; } - -.la-level-up-alt:before { - content: "\f3bf"; } - -.la-life-ring:before { - content: "\f1cd"; } - -.la-lightbulb:before { - content: "\f0eb"; } - -.la-line:before { - content: "\f3c0"; } - -.la-link:before { - content: "\f0c1"; } - -.la-linkedin:before { - content: "\f08c"; } - -.la-linkedin-in:before { - content: "\f0e1"; } - -.la-linode:before { - content: "\f2b8"; } - -.la-linux:before { - content: "\f17c"; } - -.la-lira-sign:before { - content: "\f195"; } - -.la-list:before { - content: "\f03a"; } - -.la-list-alt:before { - content: "\f022"; } - -.la-list-ol:before { - content: "\f0cb"; } - -.la-list-ul:before { - content: "\f0ca"; } - -.la-location-arrow:before { - content: "\f124"; } - -.la-lock:before { - content: "\f023"; } - -.la-lock-open:before { - content: "\f3c1"; } - -.la-long-arrow-alt-down:before { - content: "\f309"; } - -.la-long-arrow-alt-left:before { - content: "\f30a"; } - -.la-long-arrow-alt-right:before { - content: "\f30b"; } - -.la-long-arrow-alt-up:before { - content: "\f30c"; } - -.la-low-vision:before { - content: "\f2a8"; } - -.la-luggage-cart:before { - content: "\f59d"; } - -.la-lyft:before { - content: "\f3c3"; } - -.la-magento:before { - content: "\f3c4"; } - -.la-magic:before { - content: "\f0d0"; } - -.la-magnet:before { - content: "\f076"; } - -.la-mail-bulk:before { - content: "\f674"; } - -.la-mailchimp:before { - content: "\f59e"; } - -.la-male:before { - content: "\f183"; } - -.la-mandalorian:before { - content: "\f50f"; } - -.la-map:before { - content: "\f279"; } - -.la-map-marked:before { - content: "\f59f"; } - -.la-map-marked-alt:before { - content: "\f5a0"; } - -.la-map-marker:before { - content: "\f041"; } - -.la-map-marker-alt:before { - content: "\f3c5"; } - -.la-map-pin:before { - content: "\f276"; } - -.la-map-signs:before { - content: "\f277"; } - -.la-markdown:before { - content: "\f60f"; } - -.la-marker:before { - content: "\f5a1"; } - -.la-mars:before { - content: "\f222"; } - -.la-mars-double:before { - content: "\f227"; } - -.la-mars-stroke:before { - content: "\f229"; } - -.la-mars-stroke-h:before { - content: "\f22b"; } - -.la-mars-stroke-v:before { - content: "\f22a"; } - -.la-mask:before { - content: "\f6fa"; } - -.la-mastodon:before { - content: "\f4f6"; } - -.la-maxcdn:before { - content: "\f136"; } - -.la-mdb:before { - content: "\f8ca"; } - -.la-medal:before { - content: "\f5a2"; } - -.la-medapps:before { - content: "\f3c6"; } - -.la-medium:before { - content: "\f23a"; } - -.la-medium-m:before { - content: "\f3c7"; } - -.la-medkit:before { - content: "\f0fa"; } - -.la-medrt:before { - content: "\f3c8"; } - -.la-meetup:before { - content: "\f2e0"; } - -.la-megaport:before { - content: "\f5a3"; } - -.la-meh:before { - content: "\f11a"; } - -.la-meh-blank:before { - content: "\f5a4"; } - -.la-meh-rolling-eyes:before { - content: "\f5a5"; } - -.la-memory:before { - content: "\f538"; } - -.la-mendeley:before { - content: "\f7b3"; } - -.la-menorah:before { - content: "\f676"; } - -.la-mercury:before { - content: "\f223"; } - -.la-meteor:before { - content: "\f753"; } - -.la-microchip:before { - content: "\f2db"; } - -.la-microphone:before { - content: "\f130"; } - -.la-microphone-alt:before { - content: "\f3c9"; } - -.la-microphone-alt-slash:before { - content: "\f539"; } - -.la-microphone-slash:before { - content: "\f131"; } - -.la-microscope:before { - content: "\f610"; } - -.la-microsoft:before { - content: "\f3ca"; } - -.la-minus:before { - content: "\f068"; } - -.la-minus-circle:before { - content: "\f056"; } - -.la-minus-square:before { - content: "\f146"; } - -.la-mitten:before { - content: "\f7b5"; } - -.la-mix:before { - content: "\f3cb"; } - -.la-mixcloud:before { - content: "\f289"; } - -.la-mizuni:before { - content: "\f3cc"; } - -.la-mobile:before { - content: "\f10b"; } - -.la-mobile-alt:before { - content: "\f3cd"; } - -.la-modx:before { - content: "\f285"; } - -.la-monero:before { - content: "\f3d0"; } - -.la-money-bill:before { - content: "\f0d6"; } - -.la-money-bill-alt:before { - content: "\f3d1"; } - -.la-money-bill-wave:before { - content: "\f53a"; } - -.la-money-bill-wave-alt:before { - content: "\f53b"; } - -.la-money-check:before { - content: "\f53c"; } - -.la-money-check-alt:before { - content: "\f53d"; } - -.la-monument:before { - content: "\f5a6"; } - -.la-moon:before { - content: "\f186"; } - -.la-mortar-pestle:before { - content: "\f5a7"; } - -.la-mosque:before { - content: "\f678"; } - -.la-motorcycle:before { - content: "\f21c"; } - -.la-mountain:before { - content: "\f6fc"; } - -.la-mouse:before { - content: "\f8cc"; } - -.la-mouse-pointer:before { - content: "\f245"; } - -.la-mug-hot:before { - content: "\f7b6"; } - -.la-music:before { - content: "\f001"; } - -.la-napster:before { - content: "\f3d2"; } - -.la-neos:before { - content: "\f612"; } - -.la-network-wired:before { - content: "\f6ff"; } - -.la-neuter:before { - content: "\f22c"; } - -.la-newspaper:before { - content: "\f1ea"; } - -.la-nimblr:before { - content: "\f5a8"; } - -.la-node:before { - content: "\f419"; } - -.la-node-js:before { - content: "\f3d3"; } - -.la-not-equal:before { - content: "\f53e"; } - -.la-notes-medical:before { - content: "\f481"; } - -.la-npm:before { - content: "\f3d4"; } - -.la-ns8:before { - content: "\f3d5"; } - -.la-nutritionix:before { - content: "\f3d6"; } - -.la-object-group:before { - content: "\f247"; } - -.la-object-ungroup:before { - content: "\f248"; } - -.la-odnoklassniki:before { - content: "\f263"; } - -.la-odnoklassniki-square:before { - content: "\f264"; } - -.la-oil-can:before { - content: "\f613"; } - -.la-old-republic:before { - content: "\f510"; } - -.la-om:before { - content: "\f679"; } - -.la-opencart:before { - content: "\f23d"; } - -.la-openid:before { - content: "\f19b"; } - -.la-opera:before { - content: "\f26a"; } - -.la-optin-monster:before { - content: "\f23c"; } - -.la-orcid:before { - content: "\f8d2"; } - -.la-osi:before { - content: "\f41a"; } - -.la-otter:before { - content: "\f700"; } - -.la-outdent:before { - content: "\f03b"; } - -.la-page4:before { - content: "\f3d7"; } - -.la-pagelines:before { - content: "\f18c"; } - -.la-pager:before { - content: "\f815"; } - -.la-paint-brush:before { - content: "\f1fc"; } - -.la-paint-roller:before { - content: "\f5aa"; } - -.la-palette:before { - content: "\f53f"; } - -.la-palfed:before { - content: "\f3d8"; } - -.la-pallet:before { - content: "\f482"; } - -.la-paper-plane:before { - content: "\f1d8"; } - -.la-paperclip:before { - content: "\f0c6"; } - -.la-parachute-box:before { - content: "\f4cd"; } - -.la-paragraph:before { - content: "\f1dd"; } - -.la-parking:before { - content: "\f540"; } - -.la-passport:before { - content: "\f5ab"; } - -.la-pastafarianism:before { - content: "\f67b"; } - -.la-paste:before { - content: "\f0ea"; } - -.la-patreon:before { - content: "\f3d9"; } - -.la-pause:before { - content: "\f04c"; } - -.la-pause-circle:before { - content: "\f28b"; } - -.la-paw:before { - content: "\f1b0"; } - -.la-paypal:before { - content: "\f1ed"; } - -.la-peace:before { - content: "\f67c"; } - -.la-pen:before { - content: "\f304"; } - -.la-pen-alt:before { - content: "\f305"; } - -.la-pen-fancy:before { - content: "\f5ac"; } - -.la-pen-nib:before { - content: "\f5ad"; } - -.la-pen-square:before { - content: "\f14b"; } - -.la-pencil-alt:before { - content: "\f303"; } - -.la-pencil-ruler:before { - content: "\f5ae"; } - -.la-penny-arcade:before { - content: "\f704"; } - -.la-people-carry:before { - content: "\f4ce"; } - -.la-pepper-hot:before { - content: "\f816"; } - -.la-percent:before { - content: "\f295"; } - -.la-percentage:before { - content: "\f541"; } - -.la-periscope:before { - content: "\f3da"; } - -.la-person-booth:before { - content: "\f756"; } - -.la-phabricator:before { - content: "\f3db"; } - -.la-phoenix-framework:before { - content: "\f3dc"; } - -.la-phoenix-squadron:before { - content: "\f511"; } - -.la-phone:before { - content: "\f095"; } - -.la-phone-alt:before { - content: "\f879"; } - -.la-phone-slash:before { - content: "\f3dd"; } - -.la-phone-square:before { - content: "\f098"; } - -.la-phone-square-alt:before { - content: "\f87b"; } - -.la-phone-volume:before { - content: "\f2a0"; } - -.la-photo-video:before { - content: "\f87c"; } - -.la-php:before { - content: "\f457"; } - -.la-pied-piper:before { - content: "\f2ae"; } - -.la-pied-piper-alt:before { - content: "\f1a8"; } - -.la-pied-piper-hat:before { - content: "\f4e5"; } - -.la-pied-piper-pp:before { - content: "\f1a7"; } - -.la-piggy-bank:before { - content: "\f4d3"; } - -.la-pills:before { - content: "\f484"; } - -.la-pinterest:before { - content: "\f0d2"; } - -.la-pinterest-p:before { - content: "\f231"; } - -.la-pinterest-square:before { - content: "\f0d3"; } - -.la-pizza-slice:before { - content: "\f818"; } - -.la-place-of-worship:before { - content: "\f67f"; } - -.la-plane:before { - content: "\f072"; } - -.la-plane-arrival:before { - content: "\f5af"; } - -.la-plane-departure:before { - content: "\f5b0"; } - -.la-play:before { - content: "\f04b"; } - -.la-play-circle:before { - content: "\f144"; } - -.la-playstation:before { - content: "\f3df"; } - -.la-plug:before { - content: "\f1e6"; } - -.la-plus:before { - content: "\f067"; } - -.la-plus-circle:before { - content: "\f055"; } - -.la-plus-square:before { - content: "\f0fe"; } - -.la-podcast:before { - content: "\f2ce"; } - -.la-poll:before { - content: "\f681"; } - -.la-poll-h:before { - content: "\f682"; } - -.la-poo:before { - content: "\f2fe"; } - -.la-poo-storm:before { - content: "\f75a"; } - -.la-poop:before { - content: "\f619"; } - -.la-portrait:before { - content: "\f3e0"; } - -.la-pound-sign:before { - content: "\f154"; } - -.la-power-off:before { - content: "\f011"; } - -.la-pray:before { - content: "\f683"; } - -.la-praying-hands:before { - content: "\f684"; } - -.la-prescription:before { - content: "\f5b1"; } - -.la-prescription-bottle:before { - content: "\f485"; } - -.la-prescription-bottle-alt:before { - content: "\f486"; } - -.la-print:before { - content: "\f02f"; } - -.la-procedures:before { - content: "\f487"; } - -.la-product-hunt:before { - content: "\f288"; } - -.la-project-diagram:before { - content: "\f542"; } - -.la-pushed:before { - content: "\f3e1"; } - -.la-puzzle-piece:before { - content: "\f12e"; } - -.la-python:before { - content: "\f3e2"; } - -.la-qq:before { - content: "\f1d6"; } - -.la-qrcode:before { - content: "\f029"; } - -.la-question:before { - content: "\f128"; } - -.la-question-circle:before { - content: "\f059"; } - -.la-quidditch:before { - content: "\f458"; } - -.la-quinscape:before { - content: "\f459"; } - -.la-quora:before { - content: "\f2c4"; } - -.la-quote-left:before { - content: "\f10d"; } - -.la-quote-right:before { - content: "\f10e"; } - -.la-quran:before { - content: "\f687"; } - -.la-r-project:before { - content: "\f4f7"; } - -.la-radiation:before { - content: "\f7b9"; } - -.la-radiation-alt:before { - content: "\f7ba"; } - -.la-rainbow:before { - content: "\f75b"; } - -.la-random:before { - content: "\f074"; } - -.la-raspberry-pi:before { - content: "\f7bb"; } - -.la-ravelry:before { - content: "\f2d9"; } - -.la-react:before { - content: "\f41b"; } - -.la-reacteurope:before { - content: "\f75d"; } - -.la-readme:before { - content: "\f4d5"; } - -.la-rebel:before { - content: "\f1d0"; } - -.la-receipt:before { - content: "\f543"; } - -.la-record-vinyl:before { - content: "\f8d9"; } - -.la-recycle:before { - content: "\f1b8"; } - -.la-red-river:before { - content: "\f3e3"; } - -.la-reddit:before { - content: "\f1a1"; } - -.la-reddit-alien:before { - content: "\f281"; } - -.la-reddit-square:before { - content: "\f1a2"; } - -.la-redhat:before { - content: "\f7bc"; } - -.la-redo:before { - content: "\f01e"; } - -.la-redo-alt:before { - content: "\f2f9"; } - -.la-registered:before { - content: "\f25d"; } - -.la-remove-format:before { - content: "\f87d"; } - -.la-renren:before { - content: "\f18b"; } - -.la-reply:before { - content: "\f3e5"; } - -.la-reply-all:before { - content: "\f122"; } - -.la-replyd:before { - content: "\f3e6"; } - -.la-republican:before { - content: "\f75e"; } - -.la-researchgate:before { - content: "\f4f8"; } - -.la-resolving:before { - content: "\f3e7"; } - -.la-restroom:before { - content: "\f7bd"; } - -.la-retweet:before { - content: "\f079"; } - -.la-rev:before { - content: "\f5b2"; } - -.la-ribbon:before { - content: "\f4d6"; } - -.la-ring:before { - content: "\f70b"; } - -.la-road:before { - content: "\f018"; } - -.la-robot:before { - content: "\f544"; } - -.la-rocket:before { - content: "\f135"; } - -.la-rocketchat:before { - content: "\f3e8"; } - -.la-rockrms:before { - content: "\f3e9"; } - -.la-route:before { - content: "\f4d7"; } - -.la-rss:before { - content: "\f09e"; } - -.la-rss-square:before { - content: "\f143"; } - -.la-ruble-sign:before { - content: "\f158"; } - -.la-ruler:before { - content: "\f545"; } - -.la-ruler-combined:before { - content: "\f546"; } - -.la-ruler-horizontal:before { - content: "\f547"; } - -.la-ruler-vertical:before { - content: "\f548"; } - -.la-running:before { - content: "\f70c"; } - -.la-rupee-sign:before { - content: "\f156"; } - -.la-sad-cry:before { - content: "\f5b3"; } - -.la-sad-tear:before { - content: "\f5b4"; } - -.la-safari:before { - content: "\f267"; } - -.la-salesforce:before { - content: "\f83b"; } - -.la-sass:before { - content: "\f41e"; } - -.la-satellite:before { - content: "\f7bf"; } - -.la-satellite-dish:before { - content: "\f7c0"; } - -.la-save:before { - content: "\f0c7"; } - -.la-schlix:before { - content: "\f3ea"; } - -.la-school:before { - content: "\f549"; } - -.la-screwdriver:before { - content: "\f54a"; } - -.la-scribd:before { - content: "\f28a"; } - -.la-scroll:before { - content: "\f70e"; } - -.la-sd-card:before { - content: "\f7c2"; } - -.la-search:before { - content: "\f002"; } - -.la-search-dollar:before { - content: "\f688"; } - -.la-search-location:before { - content: "\f689"; } - -.la-search-minus:before { - content: "\f010"; } - -.la-search-plus:before { - content: "\f00e"; } - -.la-searchengin:before { - content: "\f3eb"; } - -.la-seedling:before { - content: "\f4d8"; } - -.la-sellcast:before { - content: "\f2da"; } - -.la-sellsy:before { - content: "\f213"; } - -.la-server:before { - content: "\f233"; } - -.la-servicestack:before { - content: "\f3ec"; } - -.la-shapes:before { - content: "\f61f"; } - -.la-share:before { - content: "\f064"; } - -.la-share-alt:before { - content: "\f1e0"; } - -.la-share-alt-square:before { - content: "\f1e1"; } - -.la-share-square:before { - content: "\f14d"; } - -.la-shekel-sign:before { - content: "\f20b"; } - -.la-shield-alt:before { - content: "\f3ed"; } - -.la-ship:before { - content: "\f21a"; } - -.la-shipping-fast:before { - content: "\f48b"; } - -.la-shirtsinbulk:before { - content: "\f214"; } - -.la-shoe-prints:before { - content: "\f54b"; } - -.la-shopping-bag:before { - content: "\f290"; } - -.la-shopping-basket:before { - content: "\f291"; } - -.la-shopping-cart:before { - content: "\f07a"; } - -.la-shopware:before { - content: "\f5b5"; } - -.la-shower:before { - content: "\f2cc"; } - -.la-shuttle-van:before { - content: "\f5b6"; } - -.la-sign:before { - content: "\f4d9"; } - -.la-sign-in-alt:before { - content: "\f2f6"; } - -.la-sign-language:before { - content: "\f2a7"; } - -.la-sign-out-alt:before { - content: "\f2f5"; } - -.la-signal:before { - content: "\f012"; } - -.la-signature:before { - content: "\f5b7"; } - -.la-sim-card:before { - content: "\f7c4"; } - -.la-simplybuilt:before { - content: "\f215"; } - -.la-sistrix:before { - content: "\f3ee"; } - -.la-sitemap:before { - content: "\f0e8"; } - -.la-sith:before { - content: "\f512"; } - -.la-skating:before { - content: "\f7c5"; } - -.la-sketch:before { - content: "\f7c6"; } - -.la-skiing:before { - content: "\f7c9"; } - -.la-skiing-nordic:before { - content: "\f7ca"; } - -.la-skull:before { - content: "\f54c"; } - -.la-skull-crossbones:before { - content: "\f714"; } - -.la-skyatlas:before { - content: "\f216"; } - -.la-skype:before { - content: "\f17e"; } - -.la-slack:before { - content: "\f198"; } - -.la-slack-hash:before { - content: "\f3ef"; } - -.la-slash:before { - content: "\f715"; } - -.la-sleigh:before { - content: "\f7cc"; } - -.la-sliders-h:before { - content: "\f1de"; } - -.la-slideshare:before { - content: "\f1e7"; } - -.la-smile:before { - content: "\f118"; } - -.la-smile-beam:before { - content: "\f5b8"; } - -.la-smile-wink:before { - content: "\f4da"; } - -.la-smog:before { - content: "\f75f"; } - -.la-smoking:before { - content: "\f48d"; } - -.la-smoking-ban:before { - content: "\f54d"; } - -.la-sms:before { - content: "\f7cd"; } - -.la-snapchat:before { - content: "\f2ab"; } - -.la-snapchat-ghost:before { - content: "\f2ac"; } - -.la-snapchat-square:before { - content: "\f2ad"; } - -.la-snowboarding:before { - content: "\f7ce"; } - -.la-snowflake:before { - content: "\f2dc"; } - -.la-snowman:before { - content: "\f7d0"; } - -.la-snowplow:before { - content: "\f7d2"; } - -.la-socks:before { - content: "\f696"; } - -.la-solar-panel:before { - content: "\f5ba"; } - -.la-sort:before { - content: "\f0dc"; } - -.la-sort-alpha-down:before { - content: "\f15d"; } - -.la-sort-alpha-down-alt:before { - content: "\f881"; } - -.la-sort-alpha-up:before { - content: "\f15e"; } - -.la-sort-alpha-up-alt:before { - content: "\f882"; } - -.la-sort-amount-down:before { - content: "\f160"; } - -.la-sort-amount-down-alt:before { - content: "\f884"; } - -.la-sort-amount-up:before { - content: "\f161"; } - -.la-sort-amount-up-alt:before { - content: "\f885"; } - -.la-sort-down:before { - content: "\f0dd"; } - -.la-sort-numeric-down:before { - content: "\f162"; } - -.la-sort-numeric-down-alt:before { - content: "\f886"; } - -.la-sort-numeric-up:before { - content: "\f163"; } - -.la-sort-numeric-up-alt:before { - content: "\f887"; } - -.la-sort-up:before { - content: "\f0de"; } - -.la-soundcloud:before { - content: "\f1be"; } - -.la-sourcetree:before { - content: "\f7d3"; } - -.la-spa:before { - content: "\f5bb"; } - -.la-space-shuttle:before { - content: "\f197"; } - -.la-speakap:before { - content: "\f3f3"; } - -.la-speaker-deck:before { - content: "\f83c"; } - -.la-spell-check:before { - content: "\f891"; } - -.la-spider:before { - content: "\f717"; } - -.la-spinner:before { - content: "\f110"; } - -.la-splotch:before { - content: "\f5bc"; } - -.la-spotify:before { - content: "\f1bc"; } - -.la-spray-can:before { - content: "\f5bd"; } - -.la-square:before { - content: "\f0c8"; } - -.la-square-full:before { - content: "\f45c"; } - -.la-square-root-alt:before { - content: "\f698"; } - -.la-squarespace:before { - content: "\f5be"; } - -.la-stack-exchange:before { - content: "\f18d"; } - -.la-stack-overflow:before { - content: "\f16c"; } - -.la-stackpath:before { - content: "\f842"; } - -.la-stamp:before { - content: "\f5bf"; } - -.la-star:before { - content: "\f005"; } - -.la-star-and-crescent:before { - content: "\f699"; } - -.la-star-half:before { - content: "\f089"; } - -.la-star-half-alt:before { - content: "\f5c0"; } - -.la-star-of-david:before { - content: "\f69a"; } - -.la-star-of-life:before { - content: "\f621"; } - -.la-staylinked:before { - content: "\f3f5"; } - -.la-steam:before { - content: "\f1b6"; } - -.la-steam-square:before { - content: "\f1b7"; } - -.la-steam-symbol:before { - content: "\f3f6"; } - -.la-step-backward:before { - content: "\f048"; } - -.la-step-forward:before { - content: "\f051"; } - -.la-stethoscope:before { - content: "\f0f1"; } - -.la-sticker-mule:before { - content: "\f3f7"; } - -.la-sticky-note:before { - content: "\f249"; } - -.la-stop:before { - content: "\f04d"; } - -.la-stop-circle:before { - content: "\f28d"; } - -.la-stopwatch:before { - content: "\f2f2"; } - -.la-store:before { - content: "\f54e"; } - -.la-store-alt:before { - content: "\f54f"; } - -.la-strava:before { - content: "\f428"; } - -.la-stream:before { - content: "\f550"; } - -.la-street-view:before { - content: "\f21d"; } - -.la-strikethrough:before { - content: "\f0cc"; } - -.la-stripe:before { - content: "\f429"; } - -.la-stripe-s:before { - content: "\f42a"; } - -.la-stroopwafel:before { - content: "\f551"; } - -.la-studiovinari:before { - content: "\f3f8"; } - -.la-stumbleupon:before { - content: "\f1a4"; } - -.la-stumbleupon-circle:before { - content: "\f1a3"; } - -.la-subscript:before { - content: "\f12c"; } - -.la-subway:before { - content: "\f239"; } - -.la-suitcase:before { - content: "\f0f2"; } - -.la-suitcase-rolling:before { - content: "\f5c1"; } - -.la-sun:before { - content: "\f185"; } - -.la-superpowers:before { - content: "\f2dd"; } - -.la-superscript:before { - content: "\f12b"; } - -.la-supple:before { - content: "\f3f9"; } - -.la-surprise:before { - content: "\f5c2"; } - -.la-suse:before { - content: "\f7d6"; } - -.la-swatchbook:before { - content: "\f5c3"; } - -.la-swift:before { - content: "\f8e1"; } - -.la-swimmer:before { - content: "\f5c4"; } - -.la-swimming-pool:before { - content: "\f5c5"; } - -.la-symfony:before { - content: "\f83d"; } - -.la-synagogue:before { - content: "\f69b"; } - -.la-sync:before { - content: "\f021"; } - -.la-sync-alt:before { - content: "\f2f1"; } - -.la-syringe:before { - content: "\f48e"; } - -.la-table:before { - content: "\f0ce"; } - -.la-table-tennis:before { - content: "\f45d"; } - -.la-tablet:before { - content: "\f10a"; } - -.la-tablet-alt:before { - content: "\f3fa"; } - -.la-tablets:before { - content: "\f490"; } - -.la-tachometer-alt:before { - content: "\f3fd"; } - -.la-tag:before { - content: "\f02b"; } - -.la-tags:before { - content: "\f02c"; } - -.la-tape:before { - content: "\f4db"; } - -.la-tasks:before { - content: "\f0ae"; } - -.la-taxi:before { - content: "\f1ba"; } - -.la-teamspeak:before { - content: "\f4f9"; } - -.la-teeth:before { - content: "\f62e"; } - -.la-teeth-open:before { - content: "\f62f"; } - -.la-telegram:before { - content: "\f2c6"; } - -.la-telegram-plane:before { - content: "\f3fe"; } - -.la-temperature-high:before { - content: "\f769"; } - -.la-temperature-low:before { - content: "\f76b"; } - -.la-tencent-weibo:before { - content: "\f1d5"; } - -.la-tenge:before { - content: "\f7d7"; } - -.la-terminal:before { - content: "\f120"; } - -.la-text-height:before { - content: "\f034"; } - -.la-text-width:before { - content: "\f035"; } - -.la-th:before { - content: "\f00a"; } - -.la-th-large:before { - content: "\f009"; } - -.la-th-list:before { - content: "\f00b"; } - -.la-the-red-yeti:before { - content: "\f69d"; } - -.la-theater-masks:before { - content: "\f630"; } - -.la-themeco:before { - content: "\f5c6"; } - -.la-themeisle:before { - content: "\f2b2"; } - -.la-thermometer:before { - content: "\f491"; } - -.la-thermometer-empty:before { - content: "\f2cb"; } - -.la-thermometer-full:before { - content: "\f2c7"; } - -.la-thermometer-half:before { - content: "\f2c9"; } - -.la-thermometer-quarter:before { - content: "\f2ca"; } - -.la-thermometer-three-quarters:before { - content: "\f2c8"; } - -.la-think-peaks:before { - content: "\f731"; } - -.la-thumbs-down:before { - content: "\f165"; } - -.la-thumbs-up:before { - content: "\f164"; } - -.la-thumbtack:before { - content: "\f08d"; } - -.la-ticket-alt:before { - content: "\f3ff"; } - -.la-times:before { - content: "\f00d"; } - -.la-times-circle:before { - content: "\f057"; } - -.la-tint:before { - content: "\f043"; } - -.la-tint-slash:before { - content: "\f5c7"; } - -.la-tired:before { - content: "\f5c8"; } - -.la-toggle-off:before { - content: "\f204"; } - -.la-toggle-on:before { - content: "\f205"; } - -.la-toilet:before { - content: "\f7d8"; } - -.la-toilet-paper:before { - content: "\f71e"; } - -.la-toolbox:before { - content: "\f552"; } - -.la-tools:before { - content: "\f7d9"; } - -.la-tooth:before { - content: "\f5c9"; } - -.la-torah:before { - content: "\f6a0"; } - -.la-torii-gate:before { - content: "\f6a1"; } - -.la-tractor:before { - content: "\f722"; } - -.la-trade-federation:before { - content: "\f513"; } - -.la-trademark:before { - content: "\f25c"; } - -.la-traffic-light:before { - content: "\f637"; } - -.la-train:before { - content: "\f238"; } - -.la-tram:before { - content: "\f7da"; } - -.la-transgender:before { - content: "\f224"; } - -.la-transgender-alt:before { - content: "\f225"; } - -.la-trash:before { - content: "\f1f8"; } - -.la-trash-alt:before { - content: "\f2ed"; } - -.la-trash-restore:before { - content: "\f829"; } - -.la-trash-restore-alt:before { - content: "\f82a"; } - -.la-tree:before { - content: "\f1bb"; } - -.la-trello:before { - content: "\f181"; } - -.la-tripadvisor:before { - content: "\f262"; } - -.la-trophy:before { - content: "\f091"; } - -.la-truck:before { - content: "\f0d1"; } - -.la-truck-loading:before { - content: "\f4de"; } - -.la-truck-monster:before { - content: "\f63b"; } - -.la-truck-moving:before { - content: "\f4df"; } - -.la-truck-pickup:before { - content: "\f63c"; } - -.la-tshirt:before { - content: "\f553"; } - -.la-tty:before { - content: "\f1e4"; } - -.la-tumblr:before { - content: "\f173"; } - -.la-tumblr-square:before { - content: "\f174"; } - -.la-tv:before { - content: "\f26c"; } - -.la-twitch:before { - content: "\f1e8"; } - -.la-twitter:before { - content: "\f099"; } - -.la-twitter-square:before { - content: "\f081"; } - -.la-typo3:before { - content: "\f42b"; } - -.la-uber:before { - content: "\f402"; } - -.la-ubuntu:before { - content: "\f7df"; } - -.la-uikit:before { - content: "\f403"; } - -.la-umbraco:before { - content: "\f8e8"; } - -.la-umbrella:before { - content: "\f0e9"; } - -.la-umbrella-beach:before { - content: "\f5ca"; } - -.la-underline:before { - content: "\f0cd"; } - -.la-undo:before { - content: "\f0e2"; } - -.la-undo-alt:before { - content: "\f2ea"; } - -.la-uniregistry:before { - content: "\f404"; } - -.la-universal-access:before { - content: "\f29a"; } - -.la-university:before { - content: "\f19c"; } - -.la-unlink:before { - content: "\f127"; } - -.la-unlock:before { - content: "\f09c"; } - -.la-unlock-alt:before { - content: "\f13e"; } - -.la-untappd:before { - content: "\f405"; } - -.la-upload:before { - content: "\f093"; } - -.la-ups:before { - content: "\f7e0"; } - -.la-usb:before { - content: "\f287"; } - -.la-user:before { - content: "\f007"; } - -.la-user-alt:before { - content: "\f406"; } - -.la-user-alt-slash:before { - content: "\f4fa"; } - -.la-user-astronaut:before { - content: "\f4fb"; } - -.la-user-check:before { - content: "\f4fc"; } - -.la-user-circle:before { - content: "\f2bd"; } - -.la-user-clock:before { - content: "\f4fd"; } - -.la-user-cog:before { - content: "\f4fe"; } - -.la-user-edit:before { - content: "\f4ff"; } - -.la-user-friends:before { - content: "\f500"; } - -.la-user-graduate:before { - content: "\f501"; } - -.la-user-injured:before { - content: "\f728"; } - -.la-user-lock:before { - content: "\f502"; } - -.la-user-md:before { - content: "\f0f0"; } - -.la-user-minus:before { - content: "\f503"; } - -.la-user-ninja:before { - content: "\f504"; } - -.la-user-nurse:before { - content: "\f82f"; } - -.la-user-plus:before { - content: "\f234"; } - -.la-user-secret:before { - content: "\f21b"; } - -.la-user-shield:before { - content: "\f505"; } - -.la-user-slash:before { - content: "\f506"; } - -.la-user-tag:before { - content: "\f507"; } - -.la-user-tie:before { - content: "\f508"; } - -.la-user-times:before { - content: "\f235"; } - -.la-users:before { - content: "\f0c0"; } - -.la-users-cog:before { - content: "\f509"; } - -.la-usps:before { - content: "\f7e1"; } - -.la-ussunnah:before { - content: "\f407"; } - -.la-utensil-spoon:before { - content: "\f2e5"; } - -.la-utensils:before { - content: "\f2e7"; } - -.la-vaadin:before { - content: "\f408"; } - -.la-vector-square:before { - content: "\f5cb"; } - -.la-venus:before { - content: "\f221"; } - -.la-venus-double:before { - content: "\f226"; } - -.la-venus-mars:before { - content: "\f228"; } - -.la-viacoin:before { - content: "\f237"; } - -.la-viadeo:before { - content: "\f2a9"; } - -.la-viadeo-square:before { - content: "\f2aa"; } - -.la-vial:before { - content: "\f492"; } - -.la-vials:before { - content: "\f493"; } - -.la-viber:before { - content: "\f409"; } - -.la-video:before { - content: "\f03d"; } - -.la-video-slash:before { - content: "\f4e2"; } - -.la-vihara:before { - content: "\f6a7"; } - -.la-vimeo:before { - content: "\f40a"; } - -.la-vimeo-square:before { - content: "\f194"; } - -.la-vimeo-v:before { - content: "\f27d"; } - -.la-vine:before { - content: "\f1ca"; } - -.la-vk:before { - content: "\f189"; } - -.la-vnv:before { - content: "\f40b"; } - -.la-voicemail:before { - content: "\f897"; } - -.la-volleyball-ball:before { - content: "\f45f"; } - -.la-volume-down:before { - content: "\f027"; } - -.la-volume-mute:before { - content: "\f6a9"; } - -.la-volume-off:before { - content: "\f026"; } - -.la-volume-up:before { - content: "\f028"; } - -.la-vote-yea:before { - content: "\f772"; } - -.la-vr-cardboard:before { - content: "\f729"; } - -.la-vuejs:before { - content: "\f41f"; } - -.la-walking:before { - content: "\f554"; } - -.la-wallet:before { - content: "\f555"; } - -.la-warehouse:before { - content: "\f494"; } - -.la-water:before { - content: "\f773"; } - -.la-wave-square:before { - content: "\f83e"; } - -.la-waze:before { - content: "\f83f"; } - -.la-weebly:before { - content: "\f5cc"; } - -.la-weibo:before { - content: "\f18a"; } - -.la-weight:before { - content: "\f496"; } - -.la-weight-hanging:before { - content: "\f5cd"; } - -.la-weixin:before { - content: "\f1d7"; } - -.la-whatsapp:before { - content: "\f232"; } - -.la-whatsapp-square:before { - content: "\f40c"; } - -.la-wheelchair:before { - content: "\f193"; } - -.la-whmcs:before { - content: "\f40d"; } - -.la-wifi:before { - content: "\f1eb"; } - -.la-wikipedia-w:before { - content: "\f266"; } - -.la-wind:before { - content: "\f72e"; } - -.la-window-close:before { - content: "\f410"; } - -.la-window-maximize:before { - content: "\f2d0"; } - -.la-window-minimize:before { - content: "\f2d1"; } - -.la-window-restore:before { - content: "\f2d2"; } - -.la-windows:before { - content: "\f17a"; } - -.la-wine-bottle:before { - content: "\f72f"; } - -.la-wine-glass:before { - content: "\f4e3"; } - -.la-wine-glass-alt:before { - content: "\f5ce"; } - -.la-wix:before { - content: "\f5cf"; } - -.la-wizards-of-the-coast:before { - content: "\f730"; } - -.la-wolf-pack-battalion:before { - content: "\f514"; } - -.la-won-sign:before { - content: "\f159"; } - -.la-wordpress:before { - content: "\f19a"; } - -.la-wordpress-simple:before { - content: "\f411"; } - -.la-wpbeginner:before { - content: "\f297"; } - -.la-wpexplorer:before { - content: "\f2de"; } - -.la-wpforms:before { - content: "\f298"; } - -.la-wpressr:before { - content: "\f3e4"; } - -.la-wrench:before { - content: "\f0ad"; } - -.la-x-ray:before { - content: "\f497"; } - -.la-xbox:before { - content: "\f412"; } - -.la-xing:before { - content: "\f168"; } - -.la-xing-square:before { - content: "\f169"; } - -.la-y-combinator:before { - content: "\f23b"; } - -.la-yahoo:before { - content: "\f19e"; } - -.la-yammer:before { - content: "\f840"; } - -.la-yandex:before { - content: "\f413"; } - -.la-yandex-international:before { - content: "\f414"; } - -.la-yarn:before { - content: "\f7e3"; } - -.la-yelp:before { - content: "\f1e9"; } - -.la-yen-sign:before { - content: "\f157"; } - -.la-yin-yang:before { - content: "\f6ad"; } - -.la-yoast:before { - content: "\f2b1"; } - -.la-youtube:before { - content: "\f167"; } - -.la-youtube-square:before { - content: "\f431"; } - -.la-zhihu:before { - content: "\f63f"; } - -.sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; } -@font-face { - font-family: 'Line Awesome Brands'; - font-style: normal; - font-weight: normal; - font-display: auto; - src: url("../fonts/la-brands-400.eot"); - src: url("../fonts/la-brands-400.eot?#iefix") format("embedded-opentype"), url("../fonts/la-brands-400.woff2") format("woff2"), url("../fonts/la-brands-400.woff") format("woff"), url("../fonts/la-brands-400.ttf") format("truetype"), url("../fonts/la-brands-400.svg#lineawesome") format("svg"); } - -.lab { - font-family: 'Line Awesome Brands'; } -@font-face { - font-family: 'Line Awesome Free'; - font-style: normal; - font-weight: 400; - font-display: auto; - src: url("../fonts/la-regular-400.eot"); - src: url("../fonts/la-regular-400.eot?#iefix") format("embedded-opentype"), url("../fonts/la-regular-400.woff2") format("woff2"), url("../fonts/la-regular-400.woff") format("woff"), url("../fonts/la-regular-400.ttf") format("truetype"), url("../fonts/la-regular-400.svg#lineawesome") format("svg"); } - -.lar { - font-family: 'Line Awesome Free'; - font-weight: 400; } -@font-face { - font-family: 'Line Awesome Free'; - font-style: normal; - font-weight: 900; - font-display: auto; - src: url("../fonts/la-solid-900.eot"); - src: url("../fonts/la-solid-900.eot?#iefix") format("embedded-opentype"), url("../fonts/la-solid-900.woff2") format("woff2"), url("../fonts/la-solid-900.woff") format("woff"), url("../fonts/la-solid-900.ttf") format("truetype"), url("../fonts/la-solid-900.svg#lineawesome") format("svg"); } - -.la, -.las { - font-family: 'Line Awesome Free'; - font-weight: 900; } - -.la.la-glass:before { - content: "\f000"; } - -.la.la-meetup { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-star-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-star-o:before { - content: "\f005"; } - -.la.la-remove:before { - content: "\f00d"; } - -.la.la-close:before { - content: "\f00d"; } - -.la.la-gear:before { - content: "\f013"; } - -.la.la-trash-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-trash-o:before { - content: "\f2ed"; } - -.la.la-file-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-o:before { - content: "\f15b"; } - -.la.la-clock-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-clock-o:before { - content: "\f017"; } - -.la.la-arrow-circle-o-down { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-arrow-circle-o-down:before { - content: "\f358"; } - -.la.la-arrow-circle-o-up { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-arrow-circle-o-up:before { - content: "\f35b"; } - -.la.la-play-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-play-circle-o:before { - content: "\f144"; } - -.la.la-repeat:before { - content: "\f01e"; } - -.la.la-rotate-right:before { - content: "\f01e"; } - -.la.la-refresh:before { - content: "\f021"; } - -.la.la-list-alt { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-dedent:before { - content: "\f03b"; } - -.la.la-video-camera:before { - content: "\f03d"; } - -.la.la-picture-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-picture-o:before { - content: "\f03e"; } - -.la.la-photo { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-photo:before { - content: "\f03e"; } - -.la.la-image { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-image:before { - content: "\f03e"; } - -.la.la-pencil:before { - content: "\f303"; } - -.la.la-map-marker:before { - content: "\f3c5"; } - -.la.la-pencil-square-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-pencil-square-o:before { - content: "\f044"; } - -.la.la-share-square-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-share-square-o:before { - content: "\f14d"; } - -.la.la-check-square-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-check-square-o:before { - content: "\f14a"; } - -.la.la-arrows:before { - content: "\f0b2"; } - -.la.la-times-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-times-circle-o:before { - content: "\f057"; } - -.la.la-check-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-check-circle-o:before { - content: "\f058"; } - -.la.la-mail-forward:before { - content: "\f064"; } - -.la.la-eye { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-eye-slash { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-warning:before { - content: "\f071"; } - -.la.la-calendar:before { - content: "\f073"; } - -.la.la-arrows-v:before { - content: "\f338"; } - -.la.la-arrows-h:before { - content: "\f337"; } - -.la.la-bar-chart { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-bar-chart:before { - content: "\f080"; } - -.la.la-bar-chart-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-bar-chart-o:before { - content: "\f080"; } - -.la.la-twitter-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-facebook-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-gears:before { - content: "\f085"; } - -.la.la-thumbs-o-up { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-thumbs-o-up:before { - content: "\f164"; } - -.la.la-thumbs-o-down { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-thumbs-o-down:before { - content: "\f165"; } - -.la.la-heart-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-heart-o:before { - content: "\f004"; } - -.la.la-sign-out:before { - content: "\f2f5"; } - -.la.la-linkedin-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-linkedin-square:before { - content: "\f08c"; } - -.la.la-thumb-tack:before { - content: "\f08d"; } - -.la.la-external-link:before { - content: "\f35d"; } - -.la.la-sign-in:before { - content: "\f2f6"; } - -.la.la-github-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-lemon-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-lemon-o:before { - content: "\f094"; } - -.la.la-square-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-square-o:before { - content: "\f0c8"; } - -.la.la-bookmark-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-bookmark-o:before { - content: "\f02e"; } - -.la.la-twitter { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-facebook { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-facebook:before { - content: "\f39e"; } - -.la.la-facebook-f { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-facebook-f:before { - content: "\f39e"; } - -.la.la-github { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-credit-card { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-feed:before { - content: "\f09e"; } - -.la.la-hdd-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hdd-o:before { - content: "\f0a0"; } - -.la.la-hand-o-right { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-o-right:before { - content: "\f0a4"; } - -.la.la-hand-o-left { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-o-left:before { - content: "\f0a5"; } - -.la.la-hand-o-up { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-o-up:before { - content: "\f0a6"; } - -.la.la-hand-o-down { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-o-down:before { - content: "\f0a7"; } - -.la.la-arrows-alt:before { - content: "\f31e"; } - -.la.la-group:before { - content: "\f0c0"; } - -.la.la-chain:before { - content: "\f0c1"; } - -.la.la-scissors:before { - content: "\f0c4"; } - -.la.la-files-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-files-o:before { - content: "\f0c5"; } - -.la.la-floppy-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-floppy-o:before { - content: "\f0c7"; } - -.la.la-navicon:before { - content: "\f0c9"; } - -.la.la-reorder:before { - content: "\f0c9"; } - -.la.la-pinterest { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-pinterest-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google-plus-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google-plus { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google-plus:before { - content: "\f0d5"; } - -.la.la-money { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-money:before { - content: "\f3d1"; } - -.la.la-unsorted:before { - content: "\f0dc"; } - -.la.la-sort-desc:before { - content: "\f0dd"; } - -.la.la-sort-asc:before { - content: "\f0de"; } - -.la.la-linkedin { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-linkedin:before { - content: "\f0e1"; } - -.la.la-rotate-left:before { - content: "\f0e2"; } - -.la.la-legal:before { - content: "\f0e3"; } - -.la.la-tachometer:before { - content: "\f3fd"; } - -.la.la-dashboard:before { - content: "\f3fd"; } - -.la.la-comment-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-comment-o:before { - content: "\f075"; } - -.la.la-comments-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-comments-o:before { - content: "\f086"; } - -.la.la-flash:before { - content: "\f0e7"; } - -.la.la-clipboard { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-paste { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-paste:before { - content: "\f328"; } - -.la.la-lightbulb-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-lightbulb-o:before { - content: "\f0eb"; } - -.la.la-exchange:before { - content: "\f362"; } - -.la.la-cloud-download:before { - content: "\f381"; } - -.la.la-cloud-upload:before { - content: "\f382"; } - -.la.la-bell-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-bell-o:before { - content: "\f0f3"; } - -.la.la-cutlery:before { - content: "\f2e7"; } - -.la.la-file-text-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-text-o:before { - content: "\f15c"; } - -.la.la-building-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-building-o:before { - content: "\f1ad"; } - -.la.la-hospital-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hospital-o:before { - content: "\f0f8"; } - -.la.la-tablet:before { - content: "\f3fa"; } - -.la.la-mobile:before { - content: "\f3cd"; } - -.la.la-mobile-phone:before { - content: "\f3cd"; } - -.la.la-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-circle-o:before { - content: "\f111"; } - -.la.la-mail-reply:before { - content: "\f3e5"; } - -.la.la-github-alt { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-folder-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-folder-o:before { - content: "\f07b"; } - -.la.la-folder-open-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-folder-open-o:before { - content: "\f07c"; } - -.la.la-smile-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-smile-o:before { - content: "\f118"; } - -.la.la-frown-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-frown-o:before { - content: "\f119"; } - -.la.la-meh-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-meh-o:before { - content: "\f11a"; } - -.la.la-keyboard-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-keyboard-o:before { - content: "\f11c"; } - -.la.la-flag-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-flag-o:before { - content: "\f024"; } - -.la.la-mail-reply-all:before { - content: "\f122"; } - -.la.la-star-half-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-star-half-o:before { - content: "\f089"; } - -.la.la-star-half-empty { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-star-half-empty:before { - content: "\f089"; } - -.la.la-star-half-full { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-star-half-full:before { - content: "\f089"; } - -.la.la-code-fork:before { - content: "\f126"; } - -.la.la-chain-broken:before { - content: "\f127"; } - -.la.la-shield:before { - content: "\f3ed"; } - -.la.la-calendar-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-calendar-o:before { - content: "\f133"; } - -.la.la-maxcdn { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-html5 { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-css3 { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-ticket:before { - content: "\f3ff"; } - -.la.la-minus-square-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-minus-square-o:before { - content: "\f146"; } - -.la.la-level-up:before { - content: "\f3bf"; } - -.la.la-level-down:before { - content: "\f3be"; } - -.la.la-pencil-square:before { - content: "\f14b"; } - -.la.la-external-link-square:before { - content: "\f360"; } - -.la.la-compass { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-caret-square-o-down { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-caret-square-o-down:before { - content: "\f150"; } - -.la.la-toggle-down { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-toggle-down:before { - content: "\f150"; } - -.la.la-caret-square-o-up { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-caret-square-o-up:before { - content: "\f151"; } - -.la.la-toggle-up { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-toggle-up:before { - content: "\f151"; } - -.la.la-caret-square-o-right { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-caret-square-o-right:before { - content: "\f152"; } - -.la.la-toggle-right { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-toggle-right:before { - content: "\f152"; } - -.la.la-eur:before { - content: "\f153"; } - -.la.la-euro:before { - content: "\f153"; } - -.la.la-gbp:before { - content: "\f154"; } - -.la.la-usd:before { - content: "\f155"; } - -.la.la-dollar:before { - content: "\f155"; } - -.la.la-inr:before { - content: "\f156"; } - -.la.la-rupee:before { - content: "\f156"; } - -.la.la-jpy:before { - content: "\f157"; } - -.la.la-cny:before { - content: "\f157"; } - -.la.la-rmb:before { - content: "\f157"; } - -.la.la-yen:before { - content: "\f157"; } - -.la.la-rub:before { - content: "\f158"; } - -.la.la-ruble:before { - content: "\f158"; } - -.la.la-rouble:before { - content: "\f158"; } - -.la.la-krw:before { - content: "\f159"; } - -.la.la-won:before { - content: "\f159"; } - -.la.la-btc { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-bitcoin { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-bitcoin:before { - content: "\f15a"; } - -.la.la-file-text:before { - content: "\f15c"; } - -.la.la-sort-alpha-asc:before { - content: "\f15d"; } - -.la.la-sort-alpha-desc:before { - content: "\f881"; } - -.la.la-sort-amount-asc:before { - content: "\f160"; } - -.la.la-sort-amount-desc:before { - content: "\f884"; } - -.la.la-sort-numeric-asc:before { - content: "\f162"; } - -.la.la-sort-numeric-desc:before { - content: "\f886"; } - -.la.la-youtube-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-youtube { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-xing { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-xing-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-youtube-play { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-youtube-play:before { - content: "\f167"; } - -.la.la-dropbox { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-stack-overflow { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-instagram { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-flickr { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-adn { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-bitbucket { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-bitbucket-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-bitbucket-square:before { - content: "\f171"; } - -.la.la-tumblr { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-tumblr-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-long-arrow-down:before { - content: "\f309"; } - -.la.la-long-arrow-up:before { - content: "\f30c"; } - -.la.la-long-arrow-left:before { - content: "\f30a"; } - -.la.la-long-arrow-right:before { - content: "\f30b"; } - -.la.la-apple { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-windows { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-android { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-linux { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-dribbble { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-skype { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-foursquare { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-trello { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-gratipay { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-gittip { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-gittip:before { - content: "\f184"; } - -.la.la-sun-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-sun-o:before { - content: "\f185"; } - -.la.la-moon-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-moon-o:before { - content: "\f186"; } - -.la.la-vk { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-weibo { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-renren { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-pagelines { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-stack-exchange { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-arrow-circle-o-right { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-arrow-circle-o-right:before { - content: "\f35a"; } - -.la.la-arrow-circle-o-left { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-arrow-circle-o-left:before { - content: "\f359"; } - -.la.la-caret-square-o-left { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-caret-square-o-left:before { - content: "\f191"; } - -.la.la-toggle-left { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-toggle-left:before { - content: "\f191"; } - -.la.la-dot-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-dot-circle-o:before { - content: "\f192"; } - -.la.la-vimeo-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-try:before { - content: "\f195"; } - -.la.la-turkish-lira:before { - content: "\f195"; } - -.la.la-plus-square-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-plus-square-o:before { - content: "\f0fe"; } - -.la.la-slack { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wordpress { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-openid { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-institution:before { - content: "\f19c"; } - -.la.la-bank:before { - content: "\f19c"; } - -.la.la-mortar-board:before { - content: "\f19d"; } - -.la.la-yahoo { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-reddit { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-reddit-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-stumbleupon-circle { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-stumbleupon { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-delicious { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-digg { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-pied-piper-pp { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-pied-piper-alt { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-drupal { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-joomla { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-spoon:before { - content: "\f2e5"; } - -.la.la-behance { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-behance-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-steam { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-steam-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-automobile:before { - content: "\f1b9"; } - -.la.la-cab:before { - content: "\f1ba"; } - -.la.la-envelope-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-envelope-o:before { - content: "\f0e0"; } - -.la.la-deviantart { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-soundcloud { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-file-pdf-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-pdf-o:before { - content: "\f1c1"; } - -.la.la-file-word-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-word-o:before { - content: "\f1c2"; } - -.la.la-file-excel-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-excel-o:before { - content: "\f1c3"; } - -.la.la-file-powerpoint-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-powerpoint-o:before { - content: "\f1c4"; } - -.la.la-file-image-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-image-o:before { - content: "\f1c5"; } - -.la.la-file-photo-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-photo-o:before { - content: "\f1c5"; } - -.la.la-file-picture-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-picture-o:before { - content: "\f1c5"; } - -.la.la-file-archive-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-archive-o:before { - content: "\f1c6"; } - -.la.la-file-zip-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-zip-o:before { - content: "\f1c6"; } - -.la.la-file-audio-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-audio-o:before { - content: "\f1c7"; } - -.la.la-file-sound-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-sound-o:before { - content: "\f1c7"; } - -.la.la-file-video-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-video-o:before { - content: "\f1c8"; } - -.la.la-file-movie-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-movie-o:before { - content: "\f1c8"; } - -.la.la-file-code-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-file-code-o:before { - content: "\f1c9"; } - -.la.la-vine { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-codepen { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-jsfiddle { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-life-ring { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-life-bouy { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-life-bouy:before { - content: "\f1cd"; } - -.la.la-life-buoy { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-life-buoy:before { - content: "\f1cd"; } - -.la.la-life-saver { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-life-saver:before { - content: "\f1cd"; } - -.la.la-support { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-support:before { - content: "\f1cd"; } - -.la.la-circle-o-notch:before { - content: "\f1ce"; } - -.la.la-rebel { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-ra { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-ra:before { - content: "\f1d0"; } - -.la.la-resistance { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-resistance:before { - content: "\f1d0"; } - -.la.la-empire { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-ge { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-ge:before { - content: "\f1d1"; } - -.la.la-git-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-git { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-hacker-news { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-y-combinator-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-y-combinator-square:before { - content: "\f1d4"; } - -.la.la-yc-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-yc-square:before { - content: "\f1d4"; } - -.la.la-tencent-weibo { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-qq { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-weixin { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wechat { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wechat:before { - content: "\f1d7"; } - -.la.la-send:before { - content: "\f1d8"; } - -.la.la-paper-plane-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-paper-plane-o:before { - content: "\f1d8"; } - -.la.la-send-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-send-o:before { - content: "\f1d8"; } - -.la.la-circle-thin { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-circle-thin:before { - content: "\f111"; } - -.la.la-header:before { - content: "\f1dc"; } - -.la.la-sliders:before { - content: "\f1de"; } - -.la.la-futbol-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-futbol-o:before { - content: "\f1e3"; } - -.la.la-soccer-ball-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-soccer-ball-o:before { - content: "\f1e3"; } - -.la.la-slideshare { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-twitch { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-yelp { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-newspaper-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-newspaper-o:before { - content: "\f1ea"; } - -.la.la-paypal { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google-wallet { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc-visa { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc-mastercard { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc-discover { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc-amex { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc-paypal { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc-stripe { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-bell-slash-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-bell-slash-o:before { - content: "\f1f6"; } - -.la.la-trash:before { - content: "\f2ed"; } - -.la.la-copyright { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-eyedropper:before { - content: "\f1fb"; } - -.la.la-area-chart:before { - content: "\f1fe"; } - -.la.la-pie-chart:before { - content: "\f200"; } - -.la.la-line-chart:before { - content: "\f201"; } - -.la.la-lastfm { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-lastfm-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-ioxhost { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-angellist { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-cc:before { - content: "\f20a"; } - -.la.la-ils:before { - content: "\f20b"; } - -.la.la-shekel:before { - content: "\f20b"; } - -.la.la-sheqel:before { - content: "\f20b"; } - -.la.la-meanpath { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-meanpath:before { - content: "\f2b4"; } - -.la.la-buysellads { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-connectdevelop { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-dashcube { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-forumbee { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-leanpub { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-sellsy { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-shirtsinbulk { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-simplybuilt { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-skyatlas { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-diamond { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-diamond:before { - content: "\f3a5"; } - -.la.la-intersex:before { - content: "\f224"; } - -.la.la-facebook-official { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-facebook-official:before { - content: "\f09a"; } - -.la.la-pinterest-p { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-whatsapp { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-hotel:before { - content: "\f236"; } - -.la.la-viacoin { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-medium { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-y-combinator { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-yc { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-yc:before { - content: "\f23b"; } - -.la.la-optin-monster { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-opencart { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-expeditedssl { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-battery-4:before { - content: "\f240"; } - -.la.la-battery:before { - content: "\f240"; } - -.la.la-battery-3:before { - content: "\f241"; } - -.la.la-battery-2:before { - content: "\f242"; } - -.la.la-battery-1:before { - content: "\f243"; } - -.la.la-battery-0:before { - content: "\f244"; } - -.la.la-object-group { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-object-ungroup { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-sticky-note-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-sticky-note-o:before { - content: "\f249"; } - -.la.la-cc-jcb { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-cc-diners-club { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-clone { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hourglass-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hourglass-o:before { - content: "\f254"; } - -.la.la-hourglass-1:before { - content: "\f251"; } - -.la.la-hourglass-2:before { - content: "\f252"; } - -.la.la-hourglass-3:before { - content: "\f253"; } - -.la.la-hand-rock-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-rock-o:before { - content: "\f255"; } - -.la.la-hand-grab-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-grab-o:before { - content: "\f255"; } - -.la.la-hand-paper-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-paper-o:before { - content: "\f256"; } - -.la.la-hand-stop-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-stop-o:before { - content: "\f256"; } - -.la.la-hand-scissors-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-scissors-o:before { - content: "\f257"; } - -.la.la-hand-lizard-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-lizard-o:before { - content: "\f258"; } - -.la.la-hand-spock-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-spock-o:before { - content: "\f259"; } - -.la.la-hand-pointer-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-pointer-o:before { - content: "\f25a"; } - -.la.la-hand-peace-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-hand-peace-o:before { - content: "\f25b"; } - -.la.la-registered { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-creative-commons { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-gg { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-gg-circle { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-tripadvisor { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-odnoklassniki { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-odnoklassniki-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-get-pocket { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wikipedia-w { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-safari { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-chrome { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-firefox { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-opera { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-internet-explorer { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-television:before { - content: "\f26c"; } - -.la.la-contao { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-500px { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-amazon { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-calendar-plus-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-calendar-plus-o:before { - content: "\f271"; } - -.la.la-calendar-minus-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-calendar-minus-o:before { - content: "\f272"; } - -.la.la-calendar-times-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-calendar-times-o:before { - content: "\f273"; } - -.la.la-calendar-check-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-calendar-check-o:before { - content: "\f274"; } - -.la.la-map-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-map-o:before { - content: "\f279"; } - -.la.la-commenting:before { - content: "\f4ad"; } - -.la.la-commenting-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-commenting-o:before { - content: "\f4ad"; } - -.la.la-houzz { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-vimeo { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-vimeo:before { - content: "\f27d"; } - -.la.la-black-tie { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-fonticons { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-reddit-alien { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-edge { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-credit-card-alt:before { - content: "\f09d"; } - -.la.la-codiepie { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-modx { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-fort-awesome { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-usb { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-product-hunt { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-mixcloud { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-scribd { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-pause-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-pause-circle-o:before { - content: "\f28b"; } - -.la.la-stop-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-stop-circle-o:before { - content: "\f28d"; } - -.la.la-bluetooth { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-bluetooth-b { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-gitlab { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wpbeginner { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wpforms { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-envira { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wheelchair-alt { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wheelchair-alt:before { - content: "\f368"; } - -.la.la-question-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-question-circle-o:before { - content: "\f059"; } - -.la.la-volume-control-phone:before { - content: "\f2a0"; } - -.la.la-asl-interpreting:before { - content: "\f2a3"; } - -.la.la-deafness:before { - content: "\f2a4"; } - -.la.la-hard-of-hearing:before { - content: "\f2a4"; } - -.la.la-glide { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-glide-g { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-signing:before { - content: "\f2a7"; } - -.la.la-viadeo { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-viadeo-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-snapchat { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-snapchat-ghost { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-snapchat-square { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-pied-piper { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-first-order { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-yoast { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-themeisle { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google-plus-official { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google-plus-official:before { - content: "\f2b3"; } - -.la.la-google-plus-circle { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-google-plus-circle:before { - content: "\f2b3"; } - -.la.la-font-awesome { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-fa { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-fa:before { - content: "\f2b4"; } - -.la.la-handshake-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-handshake-o:before { - content: "\f2b5"; } - -.la.la-envelope-open-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-envelope-open-o:before { - content: "\f2b6"; } - -.la.la-linode { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-address-book-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-address-book-o:before { - content: "\f2b9"; } - -.la.la-vcard:before { - content: "\f2bb"; } - -.la.la-address-card-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-address-card-o:before { - content: "\f2bb"; } - -.la.la-vcard-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-vcard-o:before { - content: "\f2bb"; } - -.la.la-user-circle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-user-circle-o:before { - content: "\f2bd"; } - -.la.la-user-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-user-o:before { - content: "\f007"; } - -.la.la-id-badge { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-drivers-license:before { - content: "\f2c2"; } - -.la.la-id-card-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-id-card-o:before { - content: "\f2c2"; } - -.la.la-drivers-license-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-drivers-license-o:before { - content: "\f2c2"; } - -.la.la-quora { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-free-code-camp { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-telegram { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-thermometer-4:before { - content: "\f2c7"; } - -.la.la-thermometer:before { - content: "\f2c7"; } - -.la.la-thermometer-3:before { - content: "\f2c8"; } - -.la.la-thermometer-2:before { - content: "\f2c9"; } - -.la.la-thermometer-1:before { - content: "\f2ca"; } - -.la.la-thermometer-0:before { - content: "\f2cb"; } - -.la.la-bathtub:before { - content: "\f2cd"; } - -.la.la-s15:before { - content: "\f2cd"; } - -.la.la-window-maximize { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-window-restore { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-times-rectangle:before { - content: "\f410"; } - -.la.la-window-close-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-window-close-o:before { - content: "\f410"; } - -.la.la-times-rectangle-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-times-rectangle-o:before { - content: "\f410"; } - -.la.la-bandcamp { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-grav { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-etsy { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-imdb { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-ravelry { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-eercast { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-eercast:before { - content: "\f2da"; } - -.la.la-snowflake-o { - font-family: 'Line Awesome Free'; - font-weight: 400; } - -.la.la-snowflake-o:before { - content: "\f2dc"; } - -.la.la-superpowers { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-wpexplorer { - font-family: 'Line Awesome Brands'; - font-weight: 400; } - -.la.la-spotify { - font-family: 'Line Awesome Brands'; - font-weight: 400; } diff --git a/python/static/css/line-awesome.min.css b/python/static/css/line-awesome.min.css deleted file mode 100644 index 5636d52..0000000 --- a/python/static/css/line-awesome.min.css +++ /dev/null @@ -1 +0,0 @@ -.la,.lab,.lad,.lal,.lar,.las{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.la-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.la-xs{font-size:.75em}.la-sm{font-size:.875em}.la-1x{font-size:1em}.la-2x{font-size:2em}.la-3x{font-size:3em}.la-4x{font-size:4em}.la-5x{font-size:5em}.la-6x{font-size:6em}.la-7x{font-size:7em}.la-8x{font-size:8em}.la-9x{font-size:9em}.la-10x{font-size:10em}.la-fw{text-align:center;width:1.25em}.la-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.la-ul>li{position:relative}.la-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.la-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.la-pull-left{float:left}.la-pull-right{float:right}.la.la-pull-left,.lab.la-pull-left,.lal.la-pull-left,.lar.la-pull-left,.las.la-pull-left{margin-right:.3em}.la.la-pull-right,.lab.la-pull-right,.lal.la-pull-right,.lar.la-pull-right,.las.la-pull-right{margin-left:.3em}.la-spin{-webkit-animation:la-spin 2s infinite linear;animation:la-spin 2s infinite linear}.la-pulse{-webkit-animation:la-spin 1s infinite steps(8);animation:la-spin 1s infinite steps(8)}@-webkit-keyframes la-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes la-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.la-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.la-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.la-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.la-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.la-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.la-flip-both,.la-flip-horizontal.la-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .la-flip-both,:root .la-flip-horizontal,:root .la-flip-vertical,:root .la-rotate-180,:root .la-rotate-270,:root .la-rotate-90{-webkit-filter:none;filter:none}.la-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.la-stack-1x,.la-stack-2x{left:0;position:absolute;text-align:center;width:100%}.la-stack-1x{line-height:inherit}.la-stack-2x{font-size:2em}.la-inverse{color:#fff}.la-500px:before{content:"\f26e"}.la-accessible-icon:before{content:"\f368"}.la-accusoft:before{content:"\f369"}.la-acquisitions-incorporated:before{content:"\f6af"}.la-ad:before{content:"\f641"}.la-address-book:before{content:"\f2b9"}.la-address-card:before{content:"\f2bb"}.la-adjust:before{content:"\f042"}.la-adn:before{content:"\f170"}.la-adobe:before{content:"\f778"}.la-adversal:before{content:"\f36a"}.la-affiliatetheme:before{content:"\f36b"}.la-air-freshener:before{content:"\f5d0"}.la-airbnb:before{content:"\f834"}.la-algolia:before{content:"\f36c"}.la-align-center:before{content:"\f037"}.la-align-justify:before{content:"\f039"}.la-align-left:before{content:"\f036"}.la-align-right:before{content:"\f038"}.la-alipay:before{content:"\f642"}.la-allergies:before{content:"\f461"}.la-amazon:before{content:"\f270"}.la-amazon-pay:before{content:"\f42c"}.la-ambulance:before{content:"\f0f9"}.la-american-sign-language-interpreting:before{content:"\f2a3"}.la-amilia:before{content:"\f36d"}.la-anchor:before{content:"\f13d"}.la-android:before{content:"\f17b"}.la-angellist:before{content:"\f209"}.la-angle-double-down:before{content:"\f103"}.la-angle-double-left:before{content:"\f100"}.la-angle-double-right:before{content:"\f101"}.la-angle-double-up:before{content:"\f102"}.la-angle-down:before{content:"\f107"}.la-angle-left:before{content:"\f104"}.la-angle-right:before{content:"\f105"}.la-angle-up:before{content:"\f106"}.la-angry:before{content:"\f556"}.la-angrycreative:before{content:"\f36e"}.la-angular:before{content:"\f420"}.la-ankh:before{content:"\f644"}.la-app-store:before{content:"\f36f"}.la-app-store-ios:before{content:"\f370"}.la-apper:before{content:"\f371"}.la-apple:before{content:"\f179"}.la-apple-alt:before{content:"\f5d1"}.la-apple-pay:before{content:"\f415"}.la-archive:before{content:"\f187"}.la-archway:before{content:"\f557"}.la-arrow-alt-circle-down:before{content:"\f358"}.la-arrow-alt-circle-left:before{content:"\f359"}.la-arrow-alt-circle-right:before{content:"\f35a"}.la-arrow-alt-circle-up:before{content:"\f35b"}.la-arrow-circle-down:before{content:"\f0ab"}.la-arrow-circle-left:before{content:"\f0a8"}.la-arrow-circle-right:before{content:"\f0a9"}.la-arrow-circle-up:before{content:"\f0aa"}.la-arrow-down:before{content:"\f063"}.la-arrow-left:before{content:"\f060"}.la-arrow-right:before{content:"\f061"}.la-arrow-up:before{content:"\f062"}.la-arrows-alt:before{content:"\f0b2"}.la-arrows-alt-h:before{content:"\f337"}.la-arrows-alt-v:before{content:"\f338"}.la-artstation:before{content:"\f77a"}.la-assistive-listening-systems:before{content:"\f2a2"}.la-asterisk:before{content:"\f069"}.la-asymmetrik:before{content:"\f372"}.la-at:before{content:"\f1fa"}.la-atlas:before{content:"\f558"}.la-atlassian:before{content:"\f77b"}.la-atom:before{content:"\f5d2"}.la-audible:before{content:"\f373"}.la-audio-description:before{content:"\f29e"}.la-autoprefixer:before{content:"\f41c"}.la-avianex:before{content:"\f374"}.la-aviato:before{content:"\f421"}.la-award:before{content:"\f559"}.la-aws:before{content:"\f375"}.la-baby:before{content:"\f77c"}.la-baby-carriage:before{content:"\f77d"}.la-backspace:before{content:"\f55a"}.la-backward:before{content:"\f04a"}.la-bacon:before{content:"\f7e5"}.la-balance-scale:before{content:"\f24e"}.la-balance-scale-left:before{content:"\f515"}.la-balance-scale-right:before{content:"\f516"}.la-ban:before{content:"\f05e"}.la-band-aid:before{content:"\f462"}.la-bandcamp:before{content:"\f2d5"}.la-barcode:before{content:"\f02a"}.la-bars:before{content:"\f0c9"}.la-baseball-ball:before{content:"\f433"}.la-basketball-ball:before{content:"\f434"}.la-bath:before{content:"\f2cd"}.la-battery-empty:before{content:"\f244"}.la-battery-full:before{content:"\f240"}.la-battery-half:before{content:"\f242"}.la-battery-quarter:before{content:"\f243"}.la-battery-three-quarters:before{content:"\f241"}.la-battle-net:before{content:"\f835"}.la-bed:before{content:"\f236"}.la-beer:before{content:"\f0fc"}.la-behance:before{content:"\f1b4"}.la-behance-square:before{content:"\f1b5"}.la-bell:before{content:"\f0f3"}.la-bell-slash:before{content:"\f1f6"}.la-bezier-curve:before{content:"\f55b"}.la-bible:before{content:"\f647"}.la-bicycle:before{content:"\f206"}.la-biking:before{content:"\f84a"}.la-bimobject:before{content:"\f378"}.la-binoculars:before{content:"\f1e5"}.la-biohazard:before{content:"\f780"}.la-birthday-cake:before{content:"\f1fd"}.la-bitbucket:before{content:"\f171"}.la-bitcoin:before{content:"\f379"}.la-bity:before{content:"\f37a"}.la-black-tie:before{content:"\f27e"}.la-blackberry:before{content:"\f37b"}.la-blender:before{content:"\f517"}.la-blender-phone:before{content:"\f6b6"}.la-blind:before{content:"\f29d"}.la-blog:before{content:"\f781"}.la-blogger:before{content:"\f37c"}.la-blogger-b:before{content:"\f37d"}.la-bluetooth:before{content:"\f293"}.la-bluetooth-b:before{content:"\f294"}.la-bold:before{content:"\f032"}.la-bolt:before{content:"\f0e7"}.la-bomb:before{content:"\f1e2"}.la-bone:before{content:"\f5d7"}.la-bong:before{content:"\f55c"}.la-book:before{content:"\f02d"}.la-book-dead:before{content:"\f6b7"}.la-book-medical:before{content:"\f7e6"}.la-book-open:before{content:"\f518"}.la-book-reader:before{content:"\f5da"}.la-bookmark:before{content:"\f02e"}.la-bootstrap:before{content:"\f836"}.la-border-all:before{content:"\f84c"}.la-border-none:before{content:"\f850"}.la-border-style:before{content:"\f853"}.la-bowling-ball:before{content:"\f436"}.la-box:before{content:"\f466"}.la-box-open:before{content:"\f49e"}.la-boxes:before{content:"\f468"}.la-braille:before{content:"\f2a1"}.la-brain:before{content:"\f5dc"}.la-bread-slice:before{content:"\f7ec"}.la-briefcase:before{content:"\f0b1"}.la-briefcase-medical:before{content:"\f469"}.la-broadcast-tower:before{content:"\f519"}.la-broom:before{content:"\f51a"}.la-brush:before{content:"\f55d"}.la-btc:before{content:"\f15a"}.la-buffer:before{content:"\f837"}.la-bug:before{content:"\f188"}.la-building:before{content:"\f1ad"}.la-bullhorn:before{content:"\f0a1"}.la-bullseye:before{content:"\f140"}.la-burn:before{content:"\f46a"}.la-buromobelexperte:before{content:"\f37f"}.la-bus:before{content:"\f207"}.la-bus-alt:before{content:"\f55e"}.la-business-time:before{content:"\f64a"}.la-buy-n-large:before{content:"\f8a6"}.la-buysellads:before{content:"\f20d"}.la-calculator:before{content:"\f1ec"}.la-calendar:before{content:"\f133"}.la-calendar-alt:before{content:"\f073"}.la-calendar-check:before{content:"\f274"}.la-calendar-day:before{content:"\f783"}.la-calendar-minus:before{content:"\f272"}.la-calendar-plus:before{content:"\f271"}.la-calendar-times:before{content:"\f273"}.la-calendar-week:before{content:"\f784"}.la-camera:before{content:"\f030"}.la-camera-retro:before{content:"\f083"}.la-campground:before{content:"\f6bb"}.la-canadian-maple-leaf:before{content:"\f785"}.la-candy-cane:before{content:"\f786"}.la-cannabis:before{content:"\f55f"}.la-capsules:before{content:"\f46b"}.la-car:before{content:"\f1b9"}.la-car-alt:before{content:"\f5de"}.la-car-battery:before{content:"\f5df"}.la-car-crash:before{content:"\f5e1"}.la-car-side:before{content:"\f5e4"}.la-caret-down:before{content:"\f0d7"}.la-caret-left:before{content:"\f0d9"}.la-caret-right:before{content:"\f0da"}.la-caret-square-down:before{content:"\f150"}.la-caret-square-left:before{content:"\f191"}.la-caret-square-right:before{content:"\f152"}.la-caret-square-up:before{content:"\f151"}.la-caret-up:before{content:"\f0d8"}.la-carrot:before{content:"\f787"}.la-cart-arrow-down:before{content:"\f218"}.la-cart-plus:before{content:"\f217"}.la-cash-register:before{content:"\f788"}.la-cat:before{content:"\f6be"}.la-cc-amazon-pay:before{content:"\f42d"}.la-cc-amex:before{content:"\f1f3"}.la-cc-apple-pay:before{content:"\f416"}.la-cc-diners-club:before{content:"\f24c"}.la-cc-discover:before{content:"\f1f2"}.la-cc-jcb:before{content:"\f24b"}.la-cc-mastercard:before{content:"\f1f1"}.la-cc-paypal:before{content:"\f1f4"}.la-cc-stripe:before{content:"\f1f5"}.la-cc-visa:before{content:"\f1f0"}.la-centercode:before{content:"\f380"}.la-centos:before{content:"\f789"}.la-certificate:before{content:"\f0a3"}.la-chair:before{content:"\f6c0"}.la-chalkboard:before{content:"\f51b"}.la-chalkboard-teacher:before{content:"\f51c"}.la-charging-station:before{content:"\f5e7"}.la-chart-area:before{content:"\f1fe"}.la-chart-bar:before{content:"\f080"}.la-chart-line:before{content:"\f201"}.la-chart-pie:before{content:"\f200"}.la-check:before{content:"\f00c"}.la-check-circle:before{content:"\f058"}.la-check-double:before{content:"\f560"}.la-check-square:before{content:"\f14a"}.la-cheese:before{content:"\f7ef"}.la-chess:before{content:"\f439"}.la-chess-bishop:before{content:"\f43a"}.la-chess-board:before{content:"\f43c"}.la-chess-king:before{content:"\f43f"}.la-chess-knight:before{content:"\f441"}.la-chess-pawn:before{content:"\f443"}.la-chess-queen:before{content:"\f445"}.la-chess-rook:before{content:"\f447"}.la-chevron-circle-down:before{content:"\f13a"}.la-chevron-circle-left:before{content:"\f137"}.la-chevron-circle-right:before{content:"\f138"}.la-chevron-circle-up:before{content:"\f139"}.la-chevron-down:before{content:"\f078"}.la-chevron-left:before{content:"\f053"}.la-chevron-right:before{content:"\f054"}.la-chevron-up:before{content:"\f077"}.la-child:before{content:"\f1ae"}.la-chrome:before{content:"\f268"}.la-chromecast:before{content:"\f838"}.la-church:before{content:"\f51d"}.la-circle:before{content:"\f111"}.la-circle-notch:before{content:"\f1ce"}.la-city:before{content:"\f64f"}.la-clinic-medical:before{content:"\f7f2"}.la-clipboard:before{content:"\f328"}.la-clipboard-check:before{content:"\f46c"}.la-clipboard-list:before{content:"\f46d"}.la-clock:before{content:"\f017"}.la-clone:before{content:"\f24d"}.la-closed-captioning:before{content:"\f20a"}.la-cloud:before{content:"\f0c2"}.la-cloud-download-alt:before{content:"\f381"}.la-cloud-meatball:before{content:"\f73b"}.la-cloud-moon:before{content:"\f6c3"}.la-cloud-moon-rain:before{content:"\f73c"}.la-cloud-rain:before{content:"\f73d"}.la-cloud-showers-heavy:before{content:"\f740"}.la-cloud-sun:before{content:"\f6c4"}.la-cloud-sun-rain:before{content:"\f743"}.la-cloud-upload-alt:before{content:"\f382"}.la-cloudscale:before{content:"\f383"}.la-cloudsmith:before{content:"\f384"}.la-cloudversify:before{content:"\f385"}.la-cocktail:before{content:"\f561"}.la-code:before{content:"\f121"}.la-code-branch:before{content:"\f126"}.la-codepen:before{content:"\f1cb"}.la-codiepie:before{content:"\f284"}.la-coffee:before{content:"\f0f4"}.la-cog:before{content:"\f013"}.la-cogs:before{content:"\f085"}.la-coins:before{content:"\f51e"}.la-columns:before{content:"\f0db"}.la-comment:before{content:"\f075"}.la-comment-alt:before{content:"\f27a"}.la-comment-dollar:before{content:"\f651"}.la-comment-dots:before{content:"\f4ad"}.la-comment-medical:before{content:"\f7f5"}.la-comment-slash:before{content:"\f4b3"}.la-comments:before{content:"\f086"}.la-comments-dollar:before{content:"\f653"}.la-compact-disc:before{content:"\f51f"}.la-compass:before{content:"\f14e"}.la-compress:before{content:"\f066"}.la-compress-arrows-alt:before{content:"\f78c"}.la-concierge-bell:before{content:"\f562"}.la-confluence:before{content:"\f78d"}.la-connectdevelop:before{content:"\f20e"}.la-contao:before{content:"\f26d"}.la-cookie:before{content:"\f563"}.la-cookie-bite:before{content:"\f564"}.la-copy:before{content:"\f0c5"}.la-copyright:before{content:"\f1f9"}.la-cotton-bureau:before{content:"\f89e"}.la-couch:before{content:"\f4b8"}.la-cpanel:before{content:"\f388"}.la-creative-commons:before{content:"\f25e"}.la-creative-commons-by:before{content:"\f4e7"}.la-creative-commons-nc:before{content:"\f4e8"}.la-creative-commons-nc-eu:before{content:"\f4e9"}.la-creative-commons-nc-jp:before{content:"\f4ea"}.la-creative-commons-nd:before{content:"\f4eb"}.la-creative-commons-pd:before{content:"\f4ec"}.la-creative-commons-pd-alt:before{content:"\f4ed"}.la-creative-commons-remix:before{content:"\f4ee"}.la-creative-commons-sa:before{content:"\f4ef"}.la-creative-commons-sampling:before{content:"\f4f0"}.la-creative-commons-sampling-plus:before{content:"\f4f1"}.la-creative-commons-share:before{content:"\f4f2"}.la-creative-commons-zero:before{content:"\f4f3"}.la-credit-card:before{content:"\f09d"}.la-critical-role:before{content:"\f6c9"}.la-crop:before{content:"\f125"}.la-crop-alt:before{content:"\f565"}.la-cross:before{content:"\f654"}.la-crosshairs:before{content:"\f05b"}.la-crow:before{content:"\f520"}.la-crown:before{content:"\f521"}.la-crutch:before{content:"\f7f7"}.la-css3:before{content:"\f13c"}.la-css3-alt:before{content:"\f38b"}.la-cube:before{content:"\f1b2"}.la-cubes:before{content:"\f1b3"}.la-cut:before{content:"\f0c4"}.la-cuttlefish:before{content:"\f38c"}.la-d-and-d:before{content:"\f38d"}.la-d-and-d-beyond:before{content:"\f6ca"}.la-dashcube:before{content:"\f210"}.la-database:before{content:"\f1c0"}.la-deaf:before{content:"\f2a4"}.la-delicious:before{content:"\f1a5"}.la-democrat:before{content:"\f747"}.la-deploydog:before{content:"\f38e"}.la-deskpro:before{content:"\f38f"}.la-desktop:before{content:"\f108"}.la-dev:before{content:"\f6cc"}.la-deviantart:before{content:"\f1bd"}.la-dharmachakra:before{content:"\f655"}.la-dhl:before{content:"\f790"}.la-diagnoses:before{content:"\f470"}.la-diaspora:before{content:"\f791"}.la-dice:before{content:"\f522"}.la-dice-d20:before{content:"\f6cf"}.la-dice-d6:before{content:"\f6d1"}.la-dice-five:before{content:"\f523"}.la-dice-four:before{content:"\f524"}.la-dice-one:before{content:"\f525"}.la-dice-six:before{content:"\f526"}.la-dice-three:before{content:"\f527"}.la-dice-two:before{content:"\f528"}.la-digg:before{content:"\f1a6"}.la-digital-ocean:before{content:"\f391"}.la-digital-tachograph:before{content:"\f566"}.la-directions:before{content:"\f5eb"}.la-discord:before{content:"\f392"}.la-discourse:before{content:"\f393"}.la-divide:before{content:"\f529"}.la-dizzy:before{content:"\f567"}.la-dna:before{content:"\f471"}.la-dochub:before{content:"\f394"}.la-docker:before{content:"\f395"}.la-dog:before{content:"\f6d3"}.la-dollar-sign:before{content:"\f155"}.la-dolly:before{content:"\f472"}.la-dolly-flatbed:before{content:"\f474"}.la-donate:before{content:"\f4b9"}.la-door-closed:before{content:"\f52a"}.la-door-open:before{content:"\f52b"}.la-dot-circle:before{content:"\f192"}.la-dove:before{content:"\f4ba"}.la-download:before{content:"\f019"}.la-draft2digital:before{content:"\f396"}.la-drafting-compass:before{content:"\f568"}.la-dragon:before{content:"\f6d5"}.la-draw-polygon:before{content:"\f5ee"}.la-dribbble:before{content:"\f17d"}.la-dribbble-square:before{content:"\f397"}.la-dropbox:before{content:"\f16b"}.la-drum:before{content:"\f569"}.la-drum-steelpan:before{content:"\f56a"}.la-drumstick-bite:before{content:"\f6d7"}.la-drupal:before{content:"\f1a9"}.la-dumbbell:before{content:"\f44b"}.la-dumpster:before{content:"\f793"}.la-dumpster-fire:before{content:"\f794"}.la-dungeon:before{content:"\f6d9"}.la-dyalog:before{content:"\f399"}.la-earlybirds:before{content:"\f39a"}.la-ebay:before{content:"\f4f4"}.la-edge:before{content:"\f282"}.la-edit:before{content:"\f044"}.la-egg:before{content:"\f7fb"}.la-eject:before{content:"\f052"}.la-elementor:before{content:"\f430"}.la-ellipsis-h:before{content:"\f141"}.la-ellipsis-v:before{content:"\f142"}.la-ello:before{content:"\f5f1"}.la-ember:before{content:"\f423"}.la-empire:before{content:"\f1d1"}.la-envelope:before{content:"\f0e0"}.la-envelope-open:before{content:"\f2b6"}.la-envelope-open-text:before{content:"\f658"}.la-envelope-square:before{content:"\f199"}.la-envira:before{content:"\f299"}.la-equals:before{content:"\f52c"}.la-eraser:before{content:"\f12d"}.la-erlang:before{content:"\f39d"}.la-ethereum:before{content:"\f42e"}.la-ethernet:before{content:"\f796"}.la-etsy:before{content:"\f2d7"}.la-euro-sign:before{content:"\f153"}.la-evernote:before{content:"\f839"}.la-exchange-alt:before{content:"\f362"}.la-exclamation:before{content:"\f12a"}.la-exclamation-circle:before{content:"\f06a"}.la-exclamation-triangle:before{content:"\f071"}.la-expand:before{content:"\f065"}.la-expand-arrows-alt:before{content:"\f31e"}.la-expeditedssl:before{content:"\f23e"}.la-external-link-alt:before{content:"\f35d"}.la-external-link-square-alt:before{content:"\f360"}.la-eye:before{content:"\f06e"}.la-eye-dropper:before{content:"\f1fb"}.la-eye-slash:before{content:"\f070"}.la-facebook:before{content:"\f09a"}.la-facebook-f:before{content:"\f39e"}.la-facebook-messenger:before{content:"\f39f"}.la-facebook-square:before{content:"\f082"}.la-fan:before{content:"\f863"}.la-fantasy-flight-games:before{content:"\f6dc"}.la-fast-backward:before{content:"\f049"}.la-fast-forward:before{content:"\f050"}.la-fax:before{content:"\f1ac"}.la-feather:before{content:"\f52d"}.la-feather-alt:before{content:"\f56b"}.la-fedex:before{content:"\f797"}.la-fedora:before{content:"\f798"}.la-female:before{content:"\f182"}.la-fighter-jet:before{content:"\f0fb"}.la-figma:before{content:"\f799"}.la-file:before{content:"\f15b"}.la-file-alt:before{content:"\f15c"}.la-file-archive:before{content:"\f1c6"}.la-file-audio:before{content:"\f1c7"}.la-file-code:before{content:"\f1c9"}.la-file-contract:before{content:"\f56c"}.la-file-csv:before{content:"\f6dd"}.la-file-download:before{content:"\f56d"}.la-file-excel:before{content:"\f1c3"}.la-file-export:before{content:"\f56e"}.la-file-image:before{content:"\f1c5"}.la-file-import:before{content:"\f56f"}.la-file-invoice:before{content:"\f570"}.la-file-invoice-dollar:before{content:"\f571"}.la-file-medical:before{content:"\f477"}.la-file-medical-alt:before{content:"\f478"}.la-file-pdf:before{content:"\f1c1"}.la-file-powerpoint:before{content:"\f1c4"}.la-file-prescription:before{content:"\f572"}.la-file-signature:before{content:"\f573"}.la-file-upload:before{content:"\f574"}.la-file-video:before{content:"\f1c8"}.la-file-word:before{content:"\f1c2"}.la-fill:before{content:"\f575"}.la-fill-drip:before{content:"\f576"}.la-film:before{content:"\f008"}.la-filter:before{content:"\f0b0"}.la-fingerprint:before{content:"\f577"}.la-fire:before{content:"\f06d"}.la-fire-alt:before{content:"\f7e4"}.la-fire-extinguisher:before{content:"\f134"}.la-firefox:before{content:"\f269"}.la-first-aid:before{content:"\f479"}.la-first-order:before{content:"\f2b0"}.la-first-order-alt:before{content:"\f50a"}.la-firstdraft:before{content:"\f3a1"}.la-fish:before{content:"\f578"}.la-fist-raised:before{content:"\f6de"}.la-flag:before{content:"\f024"}.la-flag-checkered:before{content:"\f11e"}.la-flag-usa:before{content:"\f74d"}.la-flask:before{content:"\f0c3"}.la-flickr:before{content:"\f16e"}.la-flipboard:before{content:"\f44d"}.la-flushed:before{content:"\f579"}.la-fly:before{content:"\f417"}.la-folder:before{content:"\f07b"}.la-folder-minus:before{content:"\f65d"}.la-folder-open:before{content:"\f07c"}.la-folder-plus:before{content:"\f65e"}.la-font:before{content:"\f031"}.la-font-awesome:before{content:"\f2b4"}.la-font-awesome-alt:before{content:"\f35c"}.la-font-awesome-flag:before{content:"\f425"}.la-font-awesome-logo-full:before{content:"\f4e6"}.la-fonticons:before{content:"\f280"}.la-fonticons-fi:before{content:"\f3a2"}.la-football-ball:before{content:"\f44e"}.la-fort-awesome:before{content:"\f286"}.la-fort-awesome-alt:before{content:"\f3a3"}.la-forumbee:before{content:"\f211"}.la-forward:before{content:"\f04e"}.la-foursquare:before{content:"\f180"}.la-free-code-camp:before{content:"\f2c5"}.la-freebsd:before{content:"\f3a4"}.la-frog:before{content:"\f52e"}.la-frown:before{content:"\f119"}.la-frown-open:before{content:"\f57a"}.la-fulcrum:before{content:"\f50b"}.la-funnel-dollar:before{content:"\f662"}.la-futbol:before{content:"\f1e3"}.la-galactic-republic:before{content:"\f50c"}.la-galactic-senate:before{content:"\f50d"}.la-gamepad:before{content:"\f11b"}.la-gas-pump:before{content:"\f52f"}.la-gavel:before{content:"\f0e3"}.la-gem:before{content:"\f3a5"}.la-genderless:before{content:"\f22d"}.la-get-pocket:before{content:"\f265"}.la-gg:before{content:"\f260"}.la-gg-circle:before{content:"\f261"}.la-ghost:before{content:"\f6e2"}.la-gift:before{content:"\f06b"}.la-gifts:before{content:"\f79c"}.la-git:before{content:"\f1d3"}.la-git-alt:before{content:"\f841"}.la-git-square:before{content:"\f1d2"}.la-github:before{content:"\f09b"}.la-github-alt:before{content:"\f113"}.la-github-square:before{content:"\f092"}.la-gitkraken:before{content:"\f3a6"}.la-gitlab:before{content:"\f296"}.la-gitter:before{content:"\f426"}.la-glass-cheers:before{content:"\f79f"}.la-glass-martini:before{content:"\f000"}.la-glass-martini-alt:before{content:"\f57b"}.la-glass-whiskey:before{content:"\f7a0"}.la-glasses:before{content:"\f530"}.la-glide:before{content:"\f2a5"}.la-glide-g:before{content:"\f2a6"}.la-globe:before{content:"\f0ac"}.la-globe-africa:before{content:"\f57c"}.la-globe-americas:before{content:"\f57d"}.la-globe-asia:before{content:"\f57e"}.la-globe-europe:before{content:"\f7a2"}.la-gofore:before{content:"\f3a7"}.la-golf-ball:before{content:"\f450"}.la-goodreads:before{content:"\f3a8"}.la-goodreads-g:before{content:"\f3a9"}.la-google:before{content:"\f1a0"}.la-google-drive:before{content:"\f3aa"}.la-google-play:before{content:"\f3ab"}.la-google-plus:before{content:"\f2b3"}.la-google-plus-g:before{content:"\f0d5"}.la-google-plus-square:before{content:"\f0d4"}.la-google-wallet:before{content:"\f1ee"}.la-gopuram:before{content:"\f664"}.la-graduation-cap:before{content:"\f19d"}.la-gratipay:before{content:"\f184"}.la-grav:before{content:"\f2d6"}.la-greater-than:before{content:"\f531"}.la-greater-than-equal:before{content:"\f532"}.la-grimace:before{content:"\f57f"}.la-grin:before{content:"\f580"}.la-grin-alt:before{content:"\f581"}.la-grin-beam:before{content:"\f582"}.la-grin-beam-sweat:before{content:"\f583"}.la-grin-hearts:before{content:"\f584"}.la-grin-squint:before{content:"\f585"}.la-grin-squint-tears:before{content:"\f586"}.la-grin-stars:before{content:"\f587"}.la-grin-tears:before{content:"\f588"}.la-grin-tongue:before{content:"\f589"}.la-grin-tongue-squint:before{content:"\f58a"}.la-grin-tongue-wink:before{content:"\f58b"}.la-grin-wink:before{content:"\f58c"}.la-grip-horizontal:before{content:"\f58d"}.la-grip-lines:before{content:"\f7a4"}.la-grip-lines-vertical:before{content:"\f7a5"}.la-grip-vertical:before{content:"\f58e"}.la-gripfire:before{content:"\f3ac"}.la-grunt:before{content:"\f3ad"}.la-guitar:before{content:"\f7a6"}.la-gulp:before{content:"\f3ae"}.la-h-square:before{content:"\f0fd"}.la-hacker-news:before{content:"\f1d4"}.la-hacker-news-square:before{content:"\f3af"}.la-hackerrank:before{content:"\f5f7"}.la-hamburger:before{content:"\f805"}.la-hammer:before{content:"\f6e3"}.la-hamsa:before{content:"\f665"}.la-hand-holding:before{content:"\f4bd"}.la-hand-holding-heart:before{content:"\f4be"}.la-hand-holding-usd:before{content:"\f4c0"}.la-hand-lizard:before{content:"\f258"}.la-hand-middle-finger:before{content:"\f806"}.la-hand-paper:before{content:"\f256"}.la-hand-peace:before{content:"\f25b"}.la-hand-point-down:before{content:"\f0a7"}.la-hand-point-left:before{content:"\f0a5"}.la-hand-point-right:before{content:"\f0a4"}.la-hand-point-up:before{content:"\f0a6"}.la-hand-pointer:before{content:"\f25a"}.la-hand-rock:before{content:"\f255"}.la-hand-scissors:before{content:"\f257"}.la-hand-spock:before{content:"\f259"}.la-hands:before{content:"\f4c2"}.la-hands-helping:before{content:"\f4c4"}.la-handshake:before{content:"\f2b5"}.la-hanukiah:before{content:"\f6e6"}.la-hard-hat:before{content:"\f807"}.la-hashtag:before{content:"\f292"}.la-hat-cowboy:before{content:"\f8c0"}.la-hat-cowboy-side:before{content:"\f8c1"}.la-hat-wizard:before{content:"\f6e8"}.la-haykal:before{content:"\f666"}.la-hdd:before{content:"\f0a0"}.la-heading:before{content:"\f1dc"}.la-headphones:before{content:"\f025"}.la-headphones-alt:before{content:"\f58f"}.la-headset:before{content:"\f590"}.la-heart:before{content:"\f004"}.la-heart-broken:before{content:"\f7a9"}.la-heartbeat:before{content:"\f21e"}.la-helicopter:before{content:"\f533"}.la-highlighter:before{content:"\f591"}.la-hiking:before{content:"\f6ec"}.la-hippo:before{content:"\f6ed"}.la-hips:before{content:"\f452"}.la-hire-a-helper:before{content:"\f3b0"}.la-history:before{content:"\f1da"}.la-hockey-puck:before{content:"\f453"}.la-holly-berry:before{content:"\f7aa"}.la-home:before{content:"\f015"}.la-hooli:before{content:"\f427"}.la-hornbill:before{content:"\f592"}.la-horse:before{content:"\f6f0"}.la-horse-head:before{content:"\f7ab"}.la-hospital:before{content:"\f0f8"}.la-hospital-alt:before{content:"\f47d"}.la-hospital-symbol:before{content:"\f47e"}.la-hot-tub:before{content:"\f593"}.la-hotdog:before{content:"\f80f"}.la-hotel:before{content:"\f594"}.la-hotjar:before{content:"\f3b1"}.la-hourglass:before{content:"\f254"}.la-hourglass-end:before{content:"\f253"}.la-hourglass-half:before{content:"\f252"}.la-hourglass-start:before{content:"\f251"}.la-house-damage:before{content:"\f6f1"}.la-houzz:before{content:"\f27c"}.la-hryvnia:before{content:"\f6f2"}.la-html5:before{content:"\f13b"}.la-hubspot:before{content:"\f3b2"}.la-i-cursor:before{content:"\f246"}.la-ice-cream:before{content:"\f810"}.la-icicles:before{content:"\f7ad"}.la-icons:before{content:"\f86d"}.la-id-badge:before{content:"\f2c1"}.la-id-card:before{content:"\f2c2"}.la-id-card-alt:before{content:"\f47f"}.la-igloo:before{content:"\f7ae"}.la-image:before{content:"\f03e"}.la-images:before{content:"\f302"}.la-imdb:before{content:"\f2d8"}.la-inbox:before{content:"\f01c"}.la-indent:before{content:"\f03c"}.la-industry:before{content:"\f275"}.la-infinity:before{content:"\f534"}.la-info:before{content:"\f129"}.la-info-circle:before{content:"\f05a"}.la-instagram:before{content:"\f16d"}.la-intercom:before{content:"\f7af"}.la-internet-explorer:before{content:"\f26b"}.la-invision:before{content:"\f7b0"}.la-ioxhost:before{content:"\f208"}.la-italic:before{content:"\f033"}.la-itch-io:before{content:"\f83a"}.la-itunes:before{content:"\f3b4"}.la-itunes-note:before{content:"\f3b5"}.la-java:before{content:"\f4e4"}.la-jedi:before{content:"\f669"}.la-jedi-order:before{content:"\f50e"}.la-jenkins:before{content:"\f3b6"}.la-jira:before{content:"\f7b1"}.la-joget:before{content:"\f3b7"}.la-joint:before{content:"\f595"}.la-joomla:before{content:"\f1aa"}.la-journal-whills:before{content:"\f66a"}.la-js:before{content:"\f3b8"}.la-js-square:before{content:"\f3b9"}.la-jsfiddle:before{content:"\f1cc"}.la-kaaba:before{content:"\f66b"}.la-kaggle:before{content:"\f5fa"}.la-key:before{content:"\f084"}.la-keybase:before{content:"\f4f5"}.la-keyboard:before{content:"\f11c"}.la-keycdn:before{content:"\f3ba"}.la-khanda:before{content:"\f66d"}.la-kickstarter:before{content:"\f3bb"}.la-kickstarter-k:before{content:"\f3bc"}.la-kiss:before{content:"\f596"}.la-kiss-beam:before{content:"\f597"}.la-kiss-wink-heart:before{content:"\f598"}.la-kiwi-bird:before{content:"\f535"}.la-korvue:before{content:"\f42f"}.la-landmark:before{content:"\f66f"}.la-language:before{content:"\f1ab"}.la-laptop:before{content:"\f109"}.la-laptop-code:before{content:"\f5fc"}.la-laptop-medical:before{content:"\f812"}.la-laravel:before{content:"\f3bd"}.la-lastfm:before{content:"\f202"}.la-lastfm-square:before{content:"\f203"}.la-laugh:before{content:"\f599"}.la-laugh-beam:before{content:"\f59a"}.la-laugh-squint:before{content:"\f59b"}.la-laugh-wink:before{content:"\f59c"}.la-layer-group:before{content:"\f5fd"}.la-leaf:before{content:"\f06c"}.la-leanpub:before{content:"\f212"}.la-lemon:before{content:"\f094"}.la-less:before{content:"\f41d"}.la-less-than:before{content:"\f536"}.la-less-than-equal:before{content:"\f537"}.la-level-down-alt:before{content:"\f3be"}.la-level-up-alt:before{content:"\f3bf"}.la-life-ring:before{content:"\f1cd"}.la-lightbulb:before{content:"\f0eb"}.la-line:before{content:"\f3c0"}.la-link:before{content:"\f0c1"}.la-linkedin:before{content:"\f08c"}.la-linkedin-in:before{content:"\f0e1"}.la-linode:before{content:"\f2b8"}.la-linux:before{content:"\f17c"}.la-lira-sign:before{content:"\f195"}.la-list:before{content:"\f03a"}.la-list-alt:before{content:"\f022"}.la-list-ol:before{content:"\f0cb"}.la-list-ul:before{content:"\f0ca"}.la-location-arrow:before{content:"\f124"}.la-lock:before{content:"\f023"}.la-lock-open:before{content:"\f3c1"}.la-long-arrow-alt-down:before{content:"\f309"}.la-long-arrow-alt-left:before{content:"\f30a"}.la-long-arrow-alt-right:before{content:"\f30b"}.la-long-arrow-alt-up:before{content:"\f30c"}.la-low-vision:before{content:"\f2a8"}.la-luggage-cart:before{content:"\f59d"}.la-lyft:before{content:"\f3c3"}.la-magento:before{content:"\f3c4"}.la-magic:before{content:"\f0d0"}.la-magnet:before{content:"\f076"}.la-mail-bulk:before{content:"\f674"}.la-mailchimp:before{content:"\f59e"}.la-male:before{content:"\f183"}.la-mandalorian:before{content:"\f50f"}.la-map:before{content:"\f279"}.la-map-marked:before{content:"\f59f"}.la-map-marked-alt:before{content:"\f5a0"}.la-map-marker:before{content:"\f041"}.la-map-marker-alt:before{content:"\f3c5"}.la-map-pin:before{content:"\f276"}.la-map-signs:before{content:"\f277"}.la-markdown:before{content:"\f60f"}.la-marker:before{content:"\f5a1"}.la-mars:before{content:"\f222"}.la-mars-double:before{content:"\f227"}.la-mars-stroke:before{content:"\f229"}.la-mars-stroke-h:before{content:"\f22b"}.la-mars-stroke-v:before{content:"\f22a"}.la-mask:before{content:"\f6fa"}.la-mastodon:before{content:"\f4f6"}.la-maxcdn:before{content:"\f136"}.la-mdb:before{content:"\f8ca"}.la-medal:before{content:"\f5a2"}.la-medapps:before{content:"\f3c6"}.la-medium:before{content:"\f23a"}.la-medium-m:before{content:"\f3c7"}.la-medkit:before{content:"\f0fa"}.la-medrt:before{content:"\f3c8"}.la-meetup:before{content:"\f2e0"}.la-megaport:before{content:"\f5a3"}.la-meh:before{content:"\f11a"}.la-meh-blank:before{content:"\f5a4"}.la-meh-rolling-eyes:before{content:"\f5a5"}.la-memory:before{content:"\f538"}.la-mendeley:before{content:"\f7b3"}.la-menorah:before{content:"\f676"}.la-mercury:before{content:"\f223"}.la-meteor:before{content:"\f753"}.la-microchip:before{content:"\f2db"}.la-microphone:before{content:"\f130"}.la-microphone-alt:before{content:"\f3c9"}.la-microphone-alt-slash:before{content:"\f539"}.la-microphone-slash:before{content:"\f131"}.la-microscope:before{content:"\f610"}.la-microsoft:before{content:"\f3ca"}.la-minus:before{content:"\f068"}.la-minus-circle:before{content:"\f056"}.la-minus-square:before{content:"\f146"}.la-mitten:before{content:"\f7b5"}.la-mix:before{content:"\f3cb"}.la-mixcloud:before{content:"\f289"}.la-mizuni:before{content:"\f3cc"}.la-mobile:before{content:"\f10b"}.la-mobile-alt:before{content:"\f3cd"}.la-modx:before{content:"\f285"}.la-monero:before{content:"\f3d0"}.la-money-bill:before{content:"\f0d6"}.la-money-bill-alt:before{content:"\f3d1"}.la-money-bill-wave:before{content:"\f53a"}.la-money-bill-wave-alt:before{content:"\f53b"}.la-money-check:before{content:"\f53c"}.la-money-check-alt:before{content:"\f53d"}.la-monument:before{content:"\f5a6"}.la-moon:before{content:"\f186"}.la-mortar-pestle:before{content:"\f5a7"}.la-mosque:before{content:"\f678"}.la-motorcycle:before{content:"\f21c"}.la-mountain:before{content:"\f6fc"}.la-mouse:before{content:"\f8cc"}.la-mouse-pointer:before{content:"\f245"}.la-mug-hot:before{content:"\f7b6"}.la-music:before{content:"\f001"}.la-napster:before{content:"\f3d2"}.la-neos:before{content:"\f612"}.la-network-wired:before{content:"\f6ff"}.la-neuter:before{content:"\f22c"}.la-newspaper:before{content:"\f1ea"}.la-nimblr:before{content:"\f5a8"}.la-node:before{content:"\f419"}.la-node-js:before{content:"\f3d3"}.la-not-equal:before{content:"\f53e"}.la-notes-medical:before{content:"\f481"}.la-npm:before{content:"\f3d4"}.la-ns8:before{content:"\f3d5"}.la-nutritionix:before{content:"\f3d6"}.la-object-group:before{content:"\f247"}.la-object-ungroup:before{content:"\f248"}.la-odnoklassniki:before{content:"\f263"}.la-odnoklassniki-square:before{content:"\f264"}.la-oil-can:before{content:"\f613"}.la-old-republic:before{content:"\f510"}.la-om:before{content:"\f679"}.la-opencart:before{content:"\f23d"}.la-openid:before{content:"\f19b"}.la-opera:before{content:"\f26a"}.la-optin-monster:before{content:"\f23c"}.la-orcid:before{content:"\f8d2"}.la-osi:before{content:"\f41a"}.la-otter:before{content:"\f700"}.la-outdent:before{content:"\f03b"}.la-page4:before{content:"\f3d7"}.la-pagelines:before{content:"\f18c"}.la-pager:before{content:"\f815"}.la-paint-brush:before{content:"\f1fc"}.la-paint-roller:before{content:"\f5aa"}.la-palette:before{content:"\f53f"}.la-palfed:before{content:"\f3d8"}.la-pallet:before{content:"\f482"}.la-paper-plane:before{content:"\f1d8"}.la-paperclip:before{content:"\f0c6"}.la-parachute-box:before{content:"\f4cd"}.la-paragraph:before{content:"\f1dd"}.la-parking:before{content:"\f540"}.la-passport:before{content:"\f5ab"}.la-pastafarianism:before{content:"\f67b"}.la-paste:before{content:"\f0ea"}.la-patreon:before{content:"\f3d9"}.la-pause:before{content:"\f04c"}.la-pause-circle:before{content:"\f28b"}.la-paw:before{content:"\f1b0"}.la-paypal:before{content:"\f1ed"}.la-peace:before{content:"\f67c"}.la-pen:before{content:"\f304"}.la-pen-alt:before{content:"\f305"}.la-pen-fancy:before{content:"\f5ac"}.la-pen-nib:before{content:"\f5ad"}.la-pen-square:before{content:"\f14b"}.la-pencil-alt:before{content:"\f303"}.la-pencil-ruler:before{content:"\f5ae"}.la-penny-arcade:before{content:"\f704"}.la-people-carry:before{content:"\f4ce"}.la-pepper-hot:before{content:"\f816"}.la-percent:before{content:"\f295"}.la-percentage:before{content:"\f541"}.la-periscope:before{content:"\f3da"}.la-person-booth:before{content:"\f756"}.la-phabricator:before{content:"\f3db"}.la-phoenix-framework:before{content:"\f3dc"}.la-phoenix-squadron:before{content:"\f511"}.la-phone:before{content:"\f095"}.la-phone-alt:before{content:"\f879"}.la-phone-slash:before{content:"\f3dd"}.la-phone-square:before{content:"\f098"}.la-phone-square-alt:before{content:"\f87b"}.la-phone-volume:before{content:"\f2a0"}.la-photo-video:before{content:"\f87c"}.la-php:before{content:"\f457"}.la-pied-piper:before{content:"\f2ae"}.la-pied-piper-alt:before{content:"\f1a8"}.la-pied-piper-hat:before{content:"\f4e5"}.la-pied-piper-pp:before{content:"\f1a7"}.la-piggy-bank:before{content:"\f4d3"}.la-pills:before{content:"\f484"}.la-pinterest:before{content:"\f0d2"}.la-pinterest-p:before{content:"\f231"}.la-pinterest-square:before{content:"\f0d3"}.la-pizza-slice:before{content:"\f818"}.la-place-of-worship:before{content:"\f67f"}.la-plane:before{content:"\f072"}.la-plane-arrival:before{content:"\f5af"}.la-plane-departure:before{content:"\f5b0"}.la-play:before{content:"\f04b"}.la-play-circle:before{content:"\f144"}.la-playstation:before{content:"\f3df"}.la-plug:before{content:"\f1e6"}.la-plus:before{content:"\f067"}.la-plus-circle:before{content:"\f055"}.la-plus-square:before{content:"\f0fe"}.la-podcast:before{content:"\f2ce"}.la-poll:before{content:"\f681"}.la-poll-h:before{content:"\f682"}.la-poo:before{content:"\f2fe"}.la-poo-storm:before{content:"\f75a"}.la-poop:before{content:"\f619"}.la-portrait:before{content:"\f3e0"}.la-pound-sign:before{content:"\f154"}.la-power-off:before{content:"\f011"}.la-pray:before{content:"\f683"}.la-praying-hands:before{content:"\f684"}.la-prescription:before{content:"\f5b1"}.la-prescription-bottle:before{content:"\f485"}.la-prescription-bottle-alt:before{content:"\f486"}.la-print:before{content:"\f02f"}.la-procedures:before{content:"\f487"}.la-product-hunt:before{content:"\f288"}.la-project-diagram:before{content:"\f542"}.la-pushed:before{content:"\f3e1"}.la-puzzle-piece:before{content:"\f12e"}.la-python:before{content:"\f3e2"}.la-qq:before{content:"\f1d6"}.la-qrcode:before{content:"\f029"}.la-question:before{content:"\f128"}.la-question-circle:before{content:"\f059"}.la-quidditch:before{content:"\f458"}.la-quinscape:before{content:"\f459"}.la-quora:before{content:"\f2c4"}.la-quote-left:before{content:"\f10d"}.la-quote-right:before{content:"\f10e"}.la-quran:before{content:"\f687"}.la-r-project:before{content:"\f4f7"}.la-radiation:before{content:"\f7b9"}.la-radiation-alt:before{content:"\f7ba"}.la-rainbow:before{content:"\f75b"}.la-random:before{content:"\f074"}.la-raspberry-pi:before{content:"\f7bb"}.la-ravelry:before{content:"\f2d9"}.la-react:before{content:"\f41b"}.la-reacteurope:before{content:"\f75d"}.la-readme:before{content:"\f4d5"}.la-rebel:before{content:"\f1d0"}.la-receipt:before{content:"\f543"}.la-record-vinyl:before{content:"\f8d9"}.la-recycle:before{content:"\f1b8"}.la-red-river:before{content:"\f3e3"}.la-reddit:before{content:"\f1a1"}.la-reddit-alien:before{content:"\f281"}.la-reddit-square:before{content:"\f1a2"}.la-redhat:before{content:"\f7bc"}.la-redo:before{content:"\f01e"}.la-redo-alt:before{content:"\f2f9"}.la-registered:before{content:"\f25d"}.la-remove-format:before{content:"\f87d"}.la-renren:before{content:"\f18b"}.la-reply:before{content:"\f3e5"}.la-reply-all:before{content:"\f122"}.la-replyd:before{content:"\f3e6"}.la-republican:before{content:"\f75e"}.la-researchgate:before{content:"\f4f8"}.la-resolving:before{content:"\f3e7"}.la-restroom:before{content:"\f7bd"}.la-retweet:before{content:"\f079"}.la-rev:before{content:"\f5b2"}.la-ribbon:before{content:"\f4d6"}.la-ring:before{content:"\f70b"}.la-road:before{content:"\f018"}.la-robot:before{content:"\f544"}.la-rocket:before{content:"\f135"}.la-rocketchat:before{content:"\f3e8"}.la-rockrms:before{content:"\f3e9"}.la-route:before{content:"\f4d7"}.la-rss:before{content:"\f09e"}.la-rss-square:before{content:"\f143"}.la-ruble-sign:before{content:"\f158"}.la-ruler:before{content:"\f545"}.la-ruler-combined:before{content:"\f546"}.la-ruler-horizontal:before{content:"\f547"}.la-ruler-vertical:before{content:"\f548"}.la-running:before{content:"\f70c"}.la-rupee-sign:before{content:"\f156"}.la-sad-cry:before{content:"\f5b3"}.la-sad-tear:before{content:"\f5b4"}.la-safari:before{content:"\f267"}.la-salesforce:before{content:"\f83b"}.la-sass:before{content:"\f41e"}.la-satellite:before{content:"\f7bf"}.la-satellite-dish:before{content:"\f7c0"}.la-save:before{content:"\f0c7"}.la-schlix:before{content:"\f3ea"}.la-school:before{content:"\f549"}.la-screwdriver:before{content:"\f54a"}.la-scribd:before{content:"\f28a"}.la-scroll:before{content:"\f70e"}.la-sd-card:before{content:"\f7c2"}.la-search:before{content:"\f002"}.la-search-dollar:before{content:"\f688"}.la-search-location:before{content:"\f689"}.la-search-minus:before{content:"\f010"}.la-search-plus:before{content:"\f00e"}.la-searchengin:before{content:"\f3eb"}.la-seedling:before{content:"\f4d8"}.la-sellcast:before{content:"\f2da"}.la-sellsy:before{content:"\f213"}.la-server:before{content:"\f233"}.la-servicestack:before{content:"\f3ec"}.la-shapes:before{content:"\f61f"}.la-share:before{content:"\f064"}.la-share-alt:before{content:"\f1e0"}.la-share-alt-square:before{content:"\f1e1"}.la-share-square:before{content:"\f14d"}.la-shekel-sign:before{content:"\f20b"}.la-shield-alt:before{content:"\f3ed"}.la-ship:before{content:"\f21a"}.la-shipping-fast:before{content:"\f48b"}.la-shirtsinbulk:before{content:"\f214"}.la-shoe-prints:before{content:"\f54b"}.la-shopping-bag:before{content:"\f290"}.la-shopping-basket:before{content:"\f291"}.la-shopping-cart:before{content:"\f07a"}.la-shopware:before{content:"\f5b5"}.la-shower:before{content:"\f2cc"}.la-shuttle-van:before{content:"\f5b6"}.la-sign:before{content:"\f4d9"}.la-sign-in-alt:before{content:"\f2f6"}.la-sign-language:before{content:"\f2a7"}.la-sign-out-alt:before{content:"\f2f5"}.la-signal:before{content:"\f012"}.la-signature:before{content:"\f5b7"}.la-sim-card:before{content:"\f7c4"}.la-simplybuilt:before{content:"\f215"}.la-sistrix:before{content:"\f3ee"}.la-sitemap:before{content:"\f0e8"}.la-sith:before{content:"\f512"}.la-skating:before{content:"\f7c5"}.la-sketch:before{content:"\f7c6"}.la-skiing:before{content:"\f7c9"}.la-skiing-nordic:before{content:"\f7ca"}.la-skull:before{content:"\f54c"}.la-skull-crossbones:before{content:"\f714"}.la-skyatlas:before{content:"\f216"}.la-skype:before{content:"\f17e"}.la-slack:before{content:"\f198"}.la-slack-hash:before{content:"\f3ef"}.la-slash:before{content:"\f715"}.la-sleigh:before{content:"\f7cc"}.la-sliders-h:before{content:"\f1de"}.la-slideshare:before{content:"\f1e7"}.la-smile:before{content:"\f118"}.la-smile-beam:before{content:"\f5b8"}.la-smile-wink:before{content:"\f4da"}.la-smog:before{content:"\f75f"}.la-smoking:before{content:"\f48d"}.la-smoking-ban:before{content:"\f54d"}.la-sms:before{content:"\f7cd"}.la-snapchat:before{content:"\f2ab"}.la-snapchat-ghost:before{content:"\f2ac"}.la-snapchat-square:before{content:"\f2ad"}.la-snowboarding:before{content:"\f7ce"}.la-snowflake:before{content:"\f2dc"}.la-snowman:before{content:"\f7d0"}.la-snowplow:before{content:"\f7d2"}.la-socks:before{content:"\f696"}.la-solar-panel:before{content:"\f5ba"}.la-sort:before{content:"\f0dc"}.la-sort-alpha-down:before{content:"\f15d"}.la-sort-alpha-down-alt:before{content:"\f881"}.la-sort-alpha-up:before{content:"\f15e"}.la-sort-alpha-up-alt:before{content:"\f882"}.la-sort-amount-down:before{content:"\f160"}.la-sort-amount-down-alt:before{content:"\f884"}.la-sort-amount-up:before{content:"\f161"}.la-sort-amount-up-alt:before{content:"\f885"}.la-sort-down:before{content:"\f0dd"}.la-sort-numeric-down:before{content:"\f162"}.la-sort-numeric-down-alt:before{content:"\f886"}.la-sort-numeric-up:before{content:"\f163"}.la-sort-numeric-up-alt:before{content:"\f887"}.la-sort-up:before{content:"\f0de"}.la-soundcloud:before{content:"\f1be"}.la-sourcetree:before{content:"\f7d3"}.la-spa:before{content:"\f5bb"}.la-space-shuttle:before{content:"\f197"}.la-speakap:before{content:"\f3f3"}.la-speaker-deck:before{content:"\f83c"}.la-spell-check:before{content:"\f891"}.la-spider:before{content:"\f717"}.la-spinner:before{content:"\f110"}.la-splotch:before{content:"\f5bc"}.la-spotify:before{content:"\f1bc"}.la-spray-can:before{content:"\f5bd"}.la-square:before{content:"\f0c8"}.la-square-full:before{content:"\f45c"}.la-square-root-alt:before{content:"\f698"}.la-squarespace:before{content:"\f5be"}.la-stack-exchange:before{content:"\f18d"}.la-stack-overflow:before{content:"\f16c"}.la-stackpath:before{content:"\f842"}.la-stamp:before{content:"\f5bf"}.la-star:before{content:"\f005"}.la-star-and-crescent:before{content:"\f699"}.la-star-half:before{content:"\f089"}.la-star-half-alt:before{content:"\f5c0"}.la-star-of-david:before{content:"\f69a"}.la-star-of-life:before{content:"\f621"}.la-staylinked:before{content:"\f3f5"}.la-steam:before{content:"\f1b6"}.la-steam-square:before{content:"\f1b7"}.la-steam-symbol:before{content:"\f3f6"}.la-step-backward:before{content:"\f048"}.la-step-forward:before{content:"\f051"}.la-stethoscope:before{content:"\f0f1"}.la-sticker-mule:before{content:"\f3f7"}.la-sticky-note:before{content:"\f249"}.la-stop:before{content:"\f04d"}.la-stop-circle:before{content:"\f28d"}.la-stopwatch:before{content:"\f2f2"}.la-store:before{content:"\f54e"}.la-store-alt:before{content:"\f54f"}.la-strava:before{content:"\f428"}.la-stream:before{content:"\f550"}.la-street-view:before{content:"\f21d"}.la-strikethrough:before{content:"\f0cc"}.la-stripe:before{content:"\f429"}.la-stripe-s:before{content:"\f42a"}.la-stroopwafel:before{content:"\f551"}.la-studiovinari:before{content:"\f3f8"}.la-stumbleupon:before{content:"\f1a4"}.la-stumbleupon-circle:before{content:"\f1a3"}.la-subscript:before{content:"\f12c"}.la-subway:before{content:"\f239"}.la-suitcase:before{content:"\f0f2"}.la-suitcase-rolling:before{content:"\f5c1"}.la-sun:before{content:"\f185"}.la-superpowers:before{content:"\f2dd"}.la-superscript:before{content:"\f12b"}.la-supple:before{content:"\f3f9"}.la-surprise:before{content:"\f5c2"}.la-suse:before{content:"\f7d6"}.la-swatchbook:before{content:"\f5c3"}.la-swift:before{content:"\f8e1"}.la-swimmer:before{content:"\f5c4"}.la-swimming-pool:before{content:"\f5c5"}.la-symfony:before{content:"\f83d"}.la-synagogue:before{content:"\f69b"}.la-sync:before{content:"\f021"}.la-sync-alt:before{content:"\f2f1"}.la-syringe:before{content:"\f48e"}.la-table:before{content:"\f0ce"}.la-table-tennis:before{content:"\f45d"}.la-tablet:before{content:"\f10a"}.la-tablet-alt:before{content:"\f3fa"}.la-tablets:before{content:"\f490"}.la-tachometer-alt:before{content:"\f3fd"}.la-tag:before{content:"\f02b"}.la-tags:before{content:"\f02c"}.la-tape:before{content:"\f4db"}.la-tasks:before{content:"\f0ae"}.la-taxi:before{content:"\f1ba"}.la-teamspeak:before{content:"\f4f9"}.la-teeth:before{content:"\f62e"}.la-teeth-open:before{content:"\f62f"}.la-telegram:before{content:"\f2c6"}.la-telegram-plane:before{content:"\f3fe"}.la-temperature-high:before{content:"\f769"}.la-temperature-low:before{content:"\f76b"}.la-tencent-weibo:before{content:"\f1d5"}.la-tenge:before{content:"\f7d7"}.la-terminal:before{content:"\f120"}.la-text-height:before{content:"\f034"}.la-text-width:before{content:"\f035"}.la-th:before{content:"\f00a"}.la-th-large:before{content:"\f009"}.la-th-list:before{content:"\f00b"}.la-the-red-yeti:before{content:"\f69d"}.la-theater-masks:before{content:"\f630"}.la-themeco:before{content:"\f5c6"}.la-themeisle:before{content:"\f2b2"}.la-thermometer:before{content:"\f491"}.la-thermometer-empty:before{content:"\f2cb"}.la-thermometer-full:before{content:"\f2c7"}.la-thermometer-half:before{content:"\f2c9"}.la-thermometer-quarter:before{content:"\f2ca"}.la-thermometer-three-quarters:before{content:"\f2c8"}.la-think-peaks:before{content:"\f731"}.la-thumbs-down:before{content:"\f165"}.la-thumbs-up:before{content:"\f164"}.la-thumbtack:before{content:"\f08d"}.la-ticket-alt:before{content:"\f3ff"}.la-times:before{content:"\f00d"}.la-times-circle:before{content:"\f057"}.la-tint:before{content:"\f043"}.la-tint-slash:before{content:"\f5c7"}.la-tired:before{content:"\f5c8"}.la-toggle-off:before{content:"\f204"}.la-toggle-on:before{content:"\f205"}.la-toilet:before{content:"\f7d8"}.la-toilet-paper:before{content:"\f71e"}.la-toolbox:before{content:"\f552"}.la-tools:before{content:"\f7d9"}.la-tooth:before{content:"\f5c9"}.la-torah:before{content:"\f6a0"}.la-torii-gate:before{content:"\f6a1"}.la-tractor:before{content:"\f722"}.la-trade-federation:before{content:"\f513"}.la-trademark:before{content:"\f25c"}.la-traffic-light:before{content:"\f637"}.la-train:before{content:"\f238"}.la-tram:before{content:"\f7da"}.la-transgender:before{content:"\f224"}.la-transgender-alt:before{content:"\f225"}.la-trash:before{content:"\f1f8"}.la-trash-alt:before{content:"\f2ed"}.la-trash-restore:before{content:"\f829"}.la-trash-restore-alt:before{content:"\f82a"}.la-tree:before{content:"\f1bb"}.la-trello:before{content:"\f181"}.la-tripadvisor:before{content:"\f262"}.la-trophy:before{content:"\f091"}.la-truck:before{content:"\f0d1"}.la-truck-loading:before{content:"\f4de"}.la-truck-monster:before{content:"\f63b"}.la-truck-moving:before{content:"\f4df"}.la-truck-pickup:before{content:"\f63c"}.la-tshirt:before{content:"\f553"}.la-tty:before{content:"\f1e4"}.la-tumblr:before{content:"\f173"}.la-tumblr-square:before{content:"\f174"}.la-tv:before{content:"\f26c"}.la-twitch:before{content:"\f1e8"}.la-twitter:before{content:"\f099"}.la-twitter-square:before{content:"\f081"}.la-typo3:before{content:"\f42b"}.la-uber:before{content:"\f402"}.la-ubuntu:before{content:"\f7df"}.la-uikit:before{content:"\f403"}.la-umbraco:before{content:"\f8e8"}.la-umbrella:before{content:"\f0e9"}.la-umbrella-beach:before{content:"\f5ca"}.la-underline:before{content:"\f0cd"}.la-undo:before{content:"\f0e2"}.la-undo-alt:before{content:"\f2ea"}.la-uniregistry:before{content:"\f404"}.la-universal-access:before{content:"\f29a"}.la-university:before{content:"\f19c"}.la-unlink:before{content:"\f127"}.la-unlock:before{content:"\f09c"}.la-unlock-alt:before{content:"\f13e"}.la-untappd:before{content:"\f405"}.la-upload:before{content:"\f093"}.la-ups:before{content:"\f7e0"}.la-usb:before{content:"\f287"}.la-user:before{content:"\f007"}.la-user-alt:before{content:"\f406"}.la-user-alt-slash:before{content:"\f4fa"}.la-user-astronaut:before{content:"\f4fb"}.la-user-check:before{content:"\f4fc"}.la-user-circle:before{content:"\f2bd"}.la-user-clock:before{content:"\f4fd"}.la-user-cog:before{content:"\f4fe"}.la-user-edit:before{content:"\f4ff"}.la-user-friends:before{content:"\f500"}.la-user-graduate:before{content:"\f501"}.la-user-injured:before{content:"\f728"}.la-user-lock:before{content:"\f502"}.la-user-md:before{content:"\f0f0"}.la-user-minus:before{content:"\f503"}.la-user-ninja:before{content:"\f504"}.la-user-nurse:before{content:"\f82f"}.la-user-plus:before{content:"\f234"}.la-user-secret:before{content:"\f21b"}.la-user-shield:before{content:"\f505"}.la-user-slash:before{content:"\f506"}.la-user-tag:before{content:"\f507"}.la-user-tie:before{content:"\f508"}.la-user-times:before{content:"\f235"}.la-users:before{content:"\f0c0"}.la-users-cog:before{content:"\f509"}.la-usps:before{content:"\f7e1"}.la-ussunnah:before{content:"\f407"}.la-utensil-spoon:before{content:"\f2e5"}.la-utensils:before{content:"\f2e7"}.la-vaadin:before{content:"\f408"}.la-vector-square:before{content:"\f5cb"}.la-venus:before{content:"\f221"}.la-venus-double:before{content:"\f226"}.la-venus-mars:before{content:"\f228"}.la-viacoin:before{content:"\f237"}.la-viadeo:before{content:"\f2a9"}.la-viadeo-square:before{content:"\f2aa"}.la-vial:before{content:"\f492"}.la-vials:before{content:"\f493"}.la-viber:before{content:"\f409"}.la-video:before{content:"\f03d"}.la-video-slash:before{content:"\f4e2"}.la-vihara:before{content:"\f6a7"}.la-vimeo:before{content:"\f40a"}.la-vimeo-square:before{content:"\f194"}.la-vimeo-v:before{content:"\f27d"}.la-vine:before{content:"\f1ca"}.la-vk:before{content:"\f189"}.la-vnv:before{content:"\f40b"}.la-voicemail:before{content:"\f897"}.la-volleyball-ball:before{content:"\f45f"}.la-volume-down:before{content:"\f027"}.la-volume-mute:before{content:"\f6a9"}.la-volume-off:before{content:"\f026"}.la-volume-up:before{content:"\f028"}.la-vote-yea:before{content:"\f772"}.la-vr-cardboard:before{content:"\f729"}.la-vuejs:before{content:"\f41f"}.la-walking:before{content:"\f554"}.la-wallet:before{content:"\f555"}.la-warehouse:before{content:"\f494"}.la-water:before{content:"\f773"}.la-wave-square:before{content:"\f83e"}.la-waze:before{content:"\f83f"}.la-weebly:before{content:"\f5cc"}.la-weibo:before{content:"\f18a"}.la-weight:before{content:"\f496"}.la-weight-hanging:before{content:"\f5cd"}.la-weixin:before{content:"\f1d7"}.la-whatsapp:before{content:"\f232"}.la-whatsapp-square:before{content:"\f40c"}.la-wheelchair:before{content:"\f193"}.la-whmcs:before{content:"\f40d"}.la-wifi:before{content:"\f1eb"}.la-wikipedia-w:before{content:"\f266"}.la-wind:before{content:"\f72e"}.la-window-close:before{content:"\f410"}.la-window-maximize:before{content:"\f2d0"}.la-window-minimize:before{content:"\f2d1"}.la-window-restore:before{content:"\f2d2"}.la-windows:before{content:"\f17a"}.la-wine-bottle:before{content:"\f72f"}.la-wine-glass:before{content:"\f4e3"}.la-wine-glass-alt:before{content:"\f5ce"}.la-wix:before{content:"\f5cf"}.la-wizards-of-the-coast:before{content:"\f730"}.la-wolf-pack-battalion:before{content:"\f514"}.la-won-sign:before{content:"\f159"}.la-wordpress:before{content:"\f19a"}.la-wordpress-simple:before{content:"\f411"}.la-wpbeginner:before{content:"\f297"}.la-wpexplorer:before{content:"\f2de"}.la-wpforms:before{content:"\f298"}.la-wpressr:before{content:"\f3e4"}.la-wrench:before{content:"\f0ad"}.la-x-ray:before{content:"\f497"}.la-xbox:before{content:"\f412"}.la-xing:before{content:"\f168"}.la-xing-square:before{content:"\f169"}.la-y-combinator:before{content:"\f23b"}.la-yahoo:before{content:"\f19e"}.la-yammer:before{content:"\f840"}.la-yandex:before{content:"\f413"}.la-yandex-international:before{content:"\f414"}.la-yarn:before{content:"\f7e3"}.la-yelp:before{content:"\f1e9"}.la-yen-sign:before{content:"\f157"}.la-yin-yang:before{content:"\f6ad"}.la-yoast:before{content:"\f2b1"}.la-youtube:before{content:"\f167"}.la-youtube-square:before{content:"\f431"}.la-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:'Line Awesome Brands';font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/la-brands-400.eot);src:url(../fonts/la-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/la-brands-400.woff2) format("woff2"),url(../fonts/la-brands-400.woff) format("woff"),url(../fonts/la-brands-400.ttf) format("truetype"),url(../fonts/la-brands-400.svg#lineawesome) format("svg")}.lab{font-family:'Line Awesome Brands'}@font-face{font-family:'Line Awesome Free';font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/la-regular-400.eot);src:url(../fonts/la-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/la-regular-400.woff2) format("woff2"),url(../fonts/la-regular-400.woff) format("woff"),url(../fonts/la-regular-400.ttf) format("truetype"),url(../fonts/la-regular-400.svg#lineawesome) format("svg")}.lar{font-family:'Line Awesome Free';font-weight:400}@font-face{font-family:'Line Awesome Free';font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/la-solid-900.eot);src:url(../fonts/la-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/la-solid-900.woff2) format("woff2"),url(../fonts/la-solid-900.woff) format("woff"),url(../fonts/la-solid-900.ttf) format("truetype"),url(../fonts/la-solid-900.svg#lineawesome) format("svg")}.la,.las{font-family:'Line Awesome Free';font-weight:900}.la.la-glass:before{content:"\f000"}.la.la-meetup{font-family:'Line Awesome Brands';font-weight:400}.la.la-star-o{font-family:'Line Awesome Free';font-weight:400}.la.la-star-o:before{content:"\f005"}.la.la-remove:before{content:"\f00d"}.la.la-close:before{content:"\f00d"}.la.la-gear:before{content:"\f013"}.la.la-trash-o{font-family:'Line Awesome Free';font-weight:400}.la.la-trash-o:before{content:"\f2ed"}.la.la-file-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-o:before{content:"\f15b"}.la.la-clock-o{font-family:'Line Awesome Free';font-weight:400}.la.la-clock-o:before{content:"\f017"}.la.la-arrow-circle-o-down{font-family:'Line Awesome Free';font-weight:400}.la.la-arrow-circle-o-down:before{content:"\f358"}.la.la-arrow-circle-o-up{font-family:'Line Awesome Free';font-weight:400}.la.la-arrow-circle-o-up:before{content:"\f35b"}.la.la-play-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-play-circle-o:before{content:"\f144"}.la.la-repeat:before{content:"\f01e"}.la.la-rotate-right:before{content:"\f01e"}.la.la-refresh:before{content:"\f021"}.la.la-list-alt{font-family:'Line Awesome Free';font-weight:400}.la.la-dedent:before{content:"\f03b"}.la.la-video-camera:before{content:"\f03d"}.la.la-picture-o{font-family:'Line Awesome Free';font-weight:400}.la.la-picture-o:before{content:"\f03e"}.la.la-photo{font-family:'Line Awesome Free';font-weight:400}.la.la-photo:before{content:"\f03e"}.la.la-image{font-family:'Line Awesome Free';font-weight:400}.la.la-image:before{content:"\f03e"}.la.la-pencil:before{content:"\f303"}.la.la-map-marker:before{content:"\f3c5"}.la.la-pencil-square-o{font-family:'Line Awesome Free';font-weight:400}.la.la-pencil-square-o:before{content:"\f044"}.la.la-share-square-o{font-family:'Line Awesome Free';font-weight:400}.la.la-share-square-o:before{content:"\f14d"}.la.la-check-square-o{font-family:'Line Awesome Free';font-weight:400}.la.la-check-square-o:before{content:"\f14a"}.la.la-arrows:before{content:"\f0b2"}.la.la-times-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-times-circle-o:before{content:"\f057"}.la.la-check-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-check-circle-o:before{content:"\f058"}.la.la-mail-forward:before{content:"\f064"}.la.la-eye{font-family:'Line Awesome Free';font-weight:400}.la.la-eye-slash{font-family:'Line Awesome Free';font-weight:400}.la.la-warning:before{content:"\f071"}.la.la-calendar:before{content:"\f073"}.la.la-arrows-v:before{content:"\f338"}.la.la-arrows-h:before{content:"\f337"}.la.la-bar-chart{font-family:'Line Awesome Free';font-weight:400}.la.la-bar-chart:before{content:"\f080"}.la.la-bar-chart-o{font-family:'Line Awesome Free';font-weight:400}.la.la-bar-chart-o:before{content:"\f080"}.la.la-twitter-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-facebook-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-gears:before{content:"\f085"}.la.la-thumbs-o-up{font-family:'Line Awesome Free';font-weight:400}.la.la-thumbs-o-up:before{content:"\f164"}.la.la-thumbs-o-down{font-family:'Line Awesome Free';font-weight:400}.la.la-thumbs-o-down:before{content:"\f165"}.la.la-heart-o{font-family:'Line Awesome Free';font-weight:400}.la.la-heart-o:before{content:"\f004"}.la.la-sign-out:before{content:"\f2f5"}.la.la-linkedin-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-linkedin-square:before{content:"\f08c"}.la.la-thumb-tack:before{content:"\f08d"}.la.la-external-link:before{content:"\f35d"}.la.la-sign-in:before{content:"\f2f6"}.la.la-github-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-lemon-o{font-family:'Line Awesome Free';font-weight:400}.la.la-lemon-o:before{content:"\f094"}.la.la-square-o{font-family:'Line Awesome Free';font-weight:400}.la.la-square-o:before{content:"\f0c8"}.la.la-bookmark-o{font-family:'Line Awesome Free';font-weight:400}.la.la-bookmark-o:before{content:"\f02e"}.la.la-twitter{font-family:'Line Awesome Brands';font-weight:400}.la.la-facebook{font-family:'Line Awesome Brands';font-weight:400}.la.la-facebook:before{content:"\f39e"}.la.la-facebook-f{font-family:'Line Awesome Brands';font-weight:400}.la.la-facebook-f:before{content:"\f39e"}.la.la-github{font-family:'Line Awesome Brands';font-weight:400}.la.la-credit-card{font-family:'Line Awesome Free';font-weight:400}.la.la-feed:before{content:"\f09e"}.la.la-hdd-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hdd-o:before{content:"\f0a0"}.la.la-hand-o-right{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-o-right:before{content:"\f0a4"}.la.la-hand-o-left{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-o-left:before{content:"\f0a5"}.la.la-hand-o-up{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-o-up:before{content:"\f0a6"}.la.la-hand-o-down{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-o-down:before{content:"\f0a7"}.la.la-arrows-alt:before{content:"\f31e"}.la.la-group:before{content:"\f0c0"}.la.la-chain:before{content:"\f0c1"}.la.la-scissors:before{content:"\f0c4"}.la.la-files-o{font-family:'Line Awesome Free';font-weight:400}.la.la-files-o:before{content:"\f0c5"}.la.la-floppy-o{font-family:'Line Awesome Free';font-weight:400}.la.la-floppy-o:before{content:"\f0c7"}.la.la-navicon:before{content:"\f0c9"}.la.la-reorder:before{content:"\f0c9"}.la.la-pinterest{font-family:'Line Awesome Brands';font-weight:400}.la.la-pinterest-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-google-plus-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-google-plus{font-family:'Line Awesome Brands';font-weight:400}.la.la-google-plus:before{content:"\f0d5"}.la.la-money{font-family:'Line Awesome Free';font-weight:400}.la.la-money:before{content:"\f3d1"}.la.la-unsorted:before{content:"\f0dc"}.la.la-sort-desc:before{content:"\f0dd"}.la.la-sort-asc:before{content:"\f0de"}.la.la-linkedin{font-family:'Line Awesome Brands';font-weight:400}.la.la-linkedin:before{content:"\f0e1"}.la.la-rotate-left:before{content:"\f0e2"}.la.la-legal:before{content:"\f0e3"}.la.la-tachometer:before{content:"\f3fd"}.la.la-dashboard:before{content:"\f3fd"}.la.la-comment-o{font-family:'Line Awesome Free';font-weight:400}.la.la-comment-o:before{content:"\f075"}.la.la-comments-o{font-family:'Line Awesome Free';font-weight:400}.la.la-comments-o:before{content:"\f086"}.la.la-flash:before{content:"\f0e7"}.la.la-clipboard{font-family:'Line Awesome Free';font-weight:400}.la.la-paste{font-family:'Line Awesome Free';font-weight:400}.la.la-paste:before{content:"\f328"}.la.la-lightbulb-o{font-family:'Line Awesome Free';font-weight:400}.la.la-lightbulb-o:before{content:"\f0eb"}.la.la-exchange:before{content:"\f362"}.la.la-cloud-download:before{content:"\f381"}.la.la-cloud-upload:before{content:"\f382"}.la.la-bell-o{font-family:'Line Awesome Free';font-weight:400}.la.la-bell-o:before{content:"\f0f3"}.la.la-cutlery:before{content:"\f2e7"}.la.la-file-text-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-text-o:before{content:"\f15c"}.la.la-building-o{font-family:'Line Awesome Free';font-weight:400}.la.la-building-o:before{content:"\f1ad"}.la.la-hospital-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hospital-o:before{content:"\f0f8"}.la.la-tablet:before{content:"\f3fa"}.la.la-mobile:before{content:"\f3cd"}.la.la-mobile-phone:before{content:"\f3cd"}.la.la-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-circle-o:before{content:"\f111"}.la.la-mail-reply:before{content:"\f3e5"}.la.la-github-alt{font-family:'Line Awesome Brands';font-weight:400}.la.la-folder-o{font-family:'Line Awesome Free';font-weight:400}.la.la-folder-o:before{content:"\f07b"}.la.la-folder-open-o{font-family:'Line Awesome Free';font-weight:400}.la.la-folder-open-o:before{content:"\f07c"}.la.la-smile-o{font-family:'Line Awesome Free';font-weight:400}.la.la-smile-o:before{content:"\f118"}.la.la-frown-o{font-family:'Line Awesome Free';font-weight:400}.la.la-frown-o:before{content:"\f119"}.la.la-meh-o{font-family:'Line Awesome Free';font-weight:400}.la.la-meh-o:before{content:"\f11a"}.la.la-keyboard-o{font-family:'Line Awesome Free';font-weight:400}.la.la-keyboard-o:before{content:"\f11c"}.la.la-flag-o{font-family:'Line Awesome Free';font-weight:400}.la.la-flag-o:before{content:"\f024"}.la.la-mail-reply-all:before{content:"\f122"}.la.la-star-half-o{font-family:'Line Awesome Free';font-weight:400}.la.la-star-half-o:before{content:"\f089"}.la.la-star-half-empty{font-family:'Line Awesome Free';font-weight:400}.la.la-star-half-empty:before{content:"\f089"}.la.la-star-half-full{font-family:'Line Awesome Free';font-weight:400}.la.la-star-half-full:before{content:"\f089"}.la.la-code-fork:before{content:"\f126"}.la.la-chain-broken:before{content:"\f127"}.la.la-shield:before{content:"\f3ed"}.la.la-calendar-o{font-family:'Line Awesome Free';font-weight:400}.la.la-calendar-o:before{content:"\f133"}.la.la-maxcdn{font-family:'Line Awesome Brands';font-weight:400}.la.la-html5{font-family:'Line Awesome Brands';font-weight:400}.la.la-css3{font-family:'Line Awesome Brands';font-weight:400}.la.la-ticket:before{content:"\f3ff"}.la.la-minus-square-o{font-family:'Line Awesome Free';font-weight:400}.la.la-minus-square-o:before{content:"\f146"}.la.la-level-up:before{content:"\f3bf"}.la.la-level-down:before{content:"\f3be"}.la.la-pencil-square:before{content:"\f14b"}.la.la-external-link-square:before{content:"\f360"}.la.la-compass{font-family:'Line Awesome Free';font-weight:400}.la.la-caret-square-o-down{font-family:'Line Awesome Free';font-weight:400}.la.la-caret-square-o-down:before{content:"\f150"}.la.la-toggle-down{font-family:'Line Awesome Free';font-weight:400}.la.la-toggle-down:before{content:"\f150"}.la.la-caret-square-o-up{font-family:'Line Awesome Free';font-weight:400}.la.la-caret-square-o-up:before{content:"\f151"}.la.la-toggle-up{font-family:'Line Awesome Free';font-weight:400}.la.la-toggle-up:before{content:"\f151"}.la.la-caret-square-o-right{font-family:'Line Awesome Free';font-weight:400}.la.la-caret-square-o-right:before{content:"\f152"}.la.la-toggle-right{font-family:'Line Awesome Free';font-weight:400}.la.la-toggle-right:before{content:"\f152"}.la.la-eur:before{content:"\f153"}.la.la-euro:before{content:"\f153"}.la.la-gbp:before{content:"\f154"}.la.la-usd:before{content:"\f155"}.la.la-dollar:before{content:"\f155"}.la.la-inr:before{content:"\f156"}.la.la-rupee:before{content:"\f156"}.la.la-jpy:before{content:"\f157"}.la.la-cny:before{content:"\f157"}.la.la-rmb:before{content:"\f157"}.la.la-yen:before{content:"\f157"}.la.la-rub:before{content:"\f158"}.la.la-ruble:before{content:"\f158"}.la.la-rouble:before{content:"\f158"}.la.la-krw:before{content:"\f159"}.la.la-won:before{content:"\f159"}.la.la-btc{font-family:'Line Awesome Brands';font-weight:400}.la.la-bitcoin{font-family:'Line Awesome Brands';font-weight:400}.la.la-bitcoin:before{content:"\f15a"}.la.la-file-text:before{content:"\f15c"}.la.la-sort-alpha-asc:before{content:"\f15d"}.la.la-sort-alpha-desc:before{content:"\f881"}.la.la-sort-amount-asc:before{content:"\f160"}.la.la-sort-amount-desc:before{content:"\f884"}.la.la-sort-numeric-asc:before{content:"\f162"}.la.la-sort-numeric-desc:before{content:"\f886"}.la.la-youtube-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-youtube{font-family:'Line Awesome Brands';font-weight:400}.la.la-xing{font-family:'Line Awesome Brands';font-weight:400}.la.la-xing-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-youtube-play{font-family:'Line Awesome Brands';font-weight:400}.la.la-youtube-play:before{content:"\f167"}.la.la-dropbox{font-family:'Line Awesome Brands';font-weight:400}.la.la-stack-overflow{font-family:'Line Awesome Brands';font-weight:400}.la.la-instagram{font-family:'Line Awesome Brands';font-weight:400}.la.la-flickr{font-family:'Line Awesome Brands';font-weight:400}.la.la-adn{font-family:'Line Awesome Brands';font-weight:400}.la.la-bitbucket{font-family:'Line Awesome Brands';font-weight:400}.la.la-bitbucket-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-bitbucket-square:before{content:"\f171"}.la.la-tumblr{font-family:'Line Awesome Brands';font-weight:400}.la.la-tumblr-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-long-arrow-down:before{content:"\f309"}.la.la-long-arrow-up:before{content:"\f30c"}.la.la-long-arrow-left:before{content:"\f30a"}.la.la-long-arrow-right:before{content:"\f30b"}.la.la-apple{font-family:'Line Awesome Brands';font-weight:400}.la.la-windows{font-family:'Line Awesome Brands';font-weight:400}.la.la-android{font-family:'Line Awesome Brands';font-weight:400}.la.la-linux{font-family:'Line Awesome Brands';font-weight:400}.la.la-dribbble{font-family:'Line Awesome Brands';font-weight:400}.la.la-skype{font-family:'Line Awesome Brands';font-weight:400}.la.la-foursquare{font-family:'Line Awesome Brands';font-weight:400}.la.la-trello{font-family:'Line Awesome Brands';font-weight:400}.la.la-gratipay{font-family:'Line Awesome Brands';font-weight:400}.la.la-gittip{font-family:'Line Awesome Brands';font-weight:400}.la.la-gittip:before{content:"\f184"}.la.la-sun-o{font-family:'Line Awesome Free';font-weight:400}.la.la-sun-o:before{content:"\f185"}.la.la-moon-o{font-family:'Line Awesome Free';font-weight:400}.la.la-moon-o:before{content:"\f186"}.la.la-vk{font-family:'Line Awesome Brands';font-weight:400}.la.la-weibo{font-family:'Line Awesome Brands';font-weight:400}.la.la-renren{font-family:'Line Awesome Brands';font-weight:400}.la.la-pagelines{font-family:'Line Awesome Brands';font-weight:400}.la.la-stack-exchange{font-family:'Line Awesome Brands';font-weight:400}.la.la-arrow-circle-o-right{font-family:'Line Awesome Free';font-weight:400}.la.la-arrow-circle-o-right:before{content:"\f35a"}.la.la-arrow-circle-o-left{font-family:'Line Awesome Free';font-weight:400}.la.la-arrow-circle-o-left:before{content:"\f359"}.la.la-caret-square-o-left{font-family:'Line Awesome Free';font-weight:400}.la.la-caret-square-o-left:before{content:"\f191"}.la.la-toggle-left{font-family:'Line Awesome Free';font-weight:400}.la.la-toggle-left:before{content:"\f191"}.la.la-dot-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-dot-circle-o:before{content:"\f192"}.la.la-vimeo-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-try:before{content:"\f195"}.la.la-turkish-lira:before{content:"\f195"}.la.la-plus-square-o{font-family:'Line Awesome Free';font-weight:400}.la.la-plus-square-o:before{content:"\f0fe"}.la.la-slack{font-family:'Line Awesome Brands';font-weight:400}.la.la-wordpress{font-family:'Line Awesome Brands';font-weight:400}.la.la-openid{font-family:'Line Awesome Brands';font-weight:400}.la.la-institution:before{content:"\f19c"}.la.la-bank:before{content:"\f19c"}.la.la-mortar-board:before{content:"\f19d"}.la.la-yahoo{font-family:'Line Awesome Brands';font-weight:400}.la.la-google{font-family:'Line Awesome Brands';font-weight:400}.la.la-reddit{font-family:'Line Awesome Brands';font-weight:400}.la.la-reddit-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-stumbleupon-circle{font-family:'Line Awesome Brands';font-weight:400}.la.la-stumbleupon{font-family:'Line Awesome Brands';font-weight:400}.la.la-delicious{font-family:'Line Awesome Brands';font-weight:400}.la.la-digg{font-family:'Line Awesome Brands';font-weight:400}.la.la-pied-piper-pp{font-family:'Line Awesome Brands';font-weight:400}.la.la-pied-piper-alt{font-family:'Line Awesome Brands';font-weight:400}.la.la-drupal{font-family:'Line Awesome Brands';font-weight:400}.la.la-joomla{font-family:'Line Awesome Brands';font-weight:400}.la.la-spoon:before{content:"\f2e5"}.la.la-behance{font-family:'Line Awesome Brands';font-weight:400}.la.la-behance-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-steam{font-family:'Line Awesome Brands';font-weight:400}.la.la-steam-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-automobile:before{content:"\f1b9"}.la.la-cab:before{content:"\f1ba"}.la.la-envelope-o{font-family:'Line Awesome Free';font-weight:400}.la.la-envelope-o:before{content:"\f0e0"}.la.la-deviantart{font-family:'Line Awesome Brands';font-weight:400}.la.la-soundcloud{font-family:'Line Awesome Brands';font-weight:400}.la.la-file-pdf-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-pdf-o:before{content:"\f1c1"}.la.la-file-word-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-word-o:before{content:"\f1c2"}.la.la-file-excel-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-excel-o:before{content:"\f1c3"}.la.la-file-powerpoint-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-powerpoint-o:before{content:"\f1c4"}.la.la-file-image-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-image-o:before{content:"\f1c5"}.la.la-file-photo-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-photo-o:before{content:"\f1c5"}.la.la-file-picture-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-picture-o:before{content:"\f1c5"}.la.la-file-archive-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-archive-o:before{content:"\f1c6"}.la.la-file-zip-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-zip-o:before{content:"\f1c6"}.la.la-file-audio-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-audio-o:before{content:"\f1c7"}.la.la-file-sound-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-sound-o:before{content:"\f1c7"}.la.la-file-video-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-video-o:before{content:"\f1c8"}.la.la-file-movie-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-movie-o:before{content:"\f1c8"}.la.la-file-code-o{font-family:'Line Awesome Free';font-weight:400}.la.la-file-code-o:before{content:"\f1c9"}.la.la-vine{font-family:'Line Awesome Brands';font-weight:400}.la.la-codepen{font-family:'Line Awesome Brands';font-weight:400}.la.la-jsfiddle{font-family:'Line Awesome Brands';font-weight:400}.la.la-life-ring{font-family:'Line Awesome Free';font-weight:400}.la.la-life-bouy{font-family:'Line Awesome Free';font-weight:400}.la.la-life-bouy:before{content:"\f1cd"}.la.la-life-buoy{font-family:'Line Awesome Free';font-weight:400}.la.la-life-buoy:before{content:"\f1cd"}.la.la-life-saver{font-family:'Line Awesome Free';font-weight:400}.la.la-life-saver:before{content:"\f1cd"}.la.la-support{font-family:'Line Awesome Free';font-weight:400}.la.la-support:before{content:"\f1cd"}.la.la-circle-o-notch:before{content:"\f1ce"}.la.la-rebel{font-family:'Line Awesome Brands';font-weight:400}.la.la-ra{font-family:'Line Awesome Brands';font-weight:400}.la.la-ra:before{content:"\f1d0"}.la.la-resistance{font-family:'Line Awesome Brands';font-weight:400}.la.la-resistance:before{content:"\f1d0"}.la.la-empire{font-family:'Line Awesome Brands';font-weight:400}.la.la-ge{font-family:'Line Awesome Brands';font-weight:400}.la.la-ge:before{content:"\f1d1"}.la.la-git-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-git{font-family:'Line Awesome Brands';font-weight:400}.la.la-hacker-news{font-family:'Line Awesome Brands';font-weight:400}.la.la-y-combinator-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-y-combinator-square:before{content:"\f1d4"}.la.la-yc-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-yc-square:before{content:"\f1d4"}.la.la-tencent-weibo{font-family:'Line Awesome Brands';font-weight:400}.la.la-qq{font-family:'Line Awesome Brands';font-weight:400}.la.la-weixin{font-family:'Line Awesome Brands';font-weight:400}.la.la-wechat{font-family:'Line Awesome Brands';font-weight:400}.la.la-wechat:before{content:"\f1d7"}.la.la-send:before{content:"\f1d8"}.la.la-paper-plane-o{font-family:'Line Awesome Free';font-weight:400}.la.la-paper-plane-o:before{content:"\f1d8"}.la.la-send-o{font-family:'Line Awesome Free';font-weight:400}.la.la-send-o:before{content:"\f1d8"}.la.la-circle-thin{font-family:'Line Awesome Free';font-weight:400}.la.la-circle-thin:before{content:"\f111"}.la.la-header:before{content:"\f1dc"}.la.la-sliders:before{content:"\f1de"}.la.la-futbol-o{font-family:'Line Awesome Free';font-weight:400}.la.la-futbol-o:before{content:"\f1e3"}.la.la-soccer-ball-o{font-family:'Line Awesome Free';font-weight:400}.la.la-soccer-ball-o:before{content:"\f1e3"}.la.la-slideshare{font-family:'Line Awesome Brands';font-weight:400}.la.la-twitch{font-family:'Line Awesome Brands';font-weight:400}.la.la-yelp{font-family:'Line Awesome Brands';font-weight:400}.la.la-newspaper-o{font-family:'Line Awesome Free';font-weight:400}.la.la-newspaper-o:before{content:"\f1ea"}.la.la-paypal{font-family:'Line Awesome Brands';font-weight:400}.la.la-google-wallet{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc-visa{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc-mastercard{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc-discover{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc-amex{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc-paypal{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc-stripe{font-family:'Line Awesome Brands';font-weight:400}.la.la-bell-slash-o{font-family:'Line Awesome Free';font-weight:400}.la.la-bell-slash-o:before{content:"\f1f6"}.la.la-trash:before{content:"\f2ed"}.la.la-copyright{font-family:'Line Awesome Free';font-weight:400}.la.la-eyedropper:before{content:"\f1fb"}.la.la-area-chart:before{content:"\f1fe"}.la.la-pie-chart:before{content:"\f200"}.la.la-line-chart:before{content:"\f201"}.la.la-lastfm{font-family:'Line Awesome Brands';font-weight:400}.la.la-lastfm-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-ioxhost{font-family:'Line Awesome Brands';font-weight:400}.la.la-angellist{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc{font-family:'Line Awesome Free';font-weight:400}.la.la-cc:before{content:"\f20a"}.la.la-ils:before{content:"\f20b"}.la.la-shekel:before{content:"\f20b"}.la.la-sheqel:before{content:"\f20b"}.la.la-meanpath{font-family:'Line Awesome Brands';font-weight:400}.la.la-meanpath:before{content:"\f2b4"}.la.la-buysellads{font-family:'Line Awesome Brands';font-weight:400}.la.la-connectdevelop{font-family:'Line Awesome Brands';font-weight:400}.la.la-dashcube{font-family:'Line Awesome Brands';font-weight:400}.la.la-forumbee{font-family:'Line Awesome Brands';font-weight:400}.la.la-leanpub{font-family:'Line Awesome Brands';font-weight:400}.la.la-sellsy{font-family:'Line Awesome Brands';font-weight:400}.la.la-shirtsinbulk{font-family:'Line Awesome Brands';font-weight:400}.la.la-simplybuilt{font-family:'Line Awesome Brands';font-weight:400}.la.la-skyatlas{font-family:'Line Awesome Brands';font-weight:400}.la.la-diamond{font-family:'Line Awesome Free';font-weight:400}.la.la-diamond:before{content:"\f3a5"}.la.la-intersex:before{content:"\f224"}.la.la-facebook-official{font-family:'Line Awesome Brands';font-weight:400}.la.la-facebook-official:before{content:"\f09a"}.la.la-pinterest-p{font-family:'Line Awesome Brands';font-weight:400}.la.la-whatsapp{font-family:'Line Awesome Brands';font-weight:400}.la.la-hotel:before{content:"\f236"}.la.la-viacoin{font-family:'Line Awesome Brands';font-weight:400}.la.la-medium{font-family:'Line Awesome Brands';font-weight:400}.la.la-y-combinator{font-family:'Line Awesome Brands';font-weight:400}.la.la-yc{font-family:'Line Awesome Brands';font-weight:400}.la.la-yc:before{content:"\f23b"}.la.la-optin-monster{font-family:'Line Awesome Brands';font-weight:400}.la.la-opencart{font-family:'Line Awesome Brands';font-weight:400}.la.la-expeditedssl{font-family:'Line Awesome Brands';font-weight:400}.la.la-battery-4:before{content:"\f240"}.la.la-battery:before{content:"\f240"}.la.la-battery-3:before{content:"\f241"}.la.la-battery-2:before{content:"\f242"}.la.la-battery-1:before{content:"\f243"}.la.la-battery-0:before{content:"\f244"}.la.la-object-group{font-family:'Line Awesome Free';font-weight:400}.la.la-object-ungroup{font-family:'Line Awesome Free';font-weight:400}.la.la-sticky-note-o{font-family:'Line Awesome Free';font-weight:400}.la.la-sticky-note-o:before{content:"\f249"}.la.la-cc-jcb{font-family:'Line Awesome Brands';font-weight:400}.la.la-cc-diners-club{font-family:'Line Awesome Brands';font-weight:400}.la.la-clone{font-family:'Line Awesome Free';font-weight:400}.la.la-hourglass-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hourglass-o:before{content:"\f254"}.la.la-hourglass-1:before{content:"\f251"}.la.la-hourglass-2:before{content:"\f252"}.la.la-hourglass-3:before{content:"\f253"}.la.la-hand-rock-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-rock-o:before{content:"\f255"}.la.la-hand-grab-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-grab-o:before{content:"\f255"}.la.la-hand-paper-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-paper-o:before{content:"\f256"}.la.la-hand-stop-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-stop-o:before{content:"\f256"}.la.la-hand-scissors-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-scissors-o:before{content:"\f257"}.la.la-hand-lizard-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-lizard-o:before{content:"\f258"}.la.la-hand-spock-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-spock-o:before{content:"\f259"}.la.la-hand-pointer-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-pointer-o:before{content:"\f25a"}.la.la-hand-peace-o{font-family:'Line Awesome Free';font-weight:400}.la.la-hand-peace-o:before{content:"\f25b"}.la.la-registered{font-family:'Line Awesome Free';font-weight:400}.la.la-creative-commons{font-family:'Line Awesome Brands';font-weight:400}.la.la-gg{font-family:'Line Awesome Brands';font-weight:400}.la.la-gg-circle{font-family:'Line Awesome Brands';font-weight:400}.la.la-tripadvisor{font-family:'Line Awesome Brands';font-weight:400}.la.la-odnoklassniki{font-family:'Line Awesome Brands';font-weight:400}.la.la-odnoklassniki-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-get-pocket{font-family:'Line Awesome Brands';font-weight:400}.la.la-wikipedia-w{font-family:'Line Awesome Brands';font-weight:400}.la.la-safari{font-family:'Line Awesome Brands';font-weight:400}.la.la-chrome{font-family:'Line Awesome Brands';font-weight:400}.la.la-firefox{font-family:'Line Awesome Brands';font-weight:400}.la.la-opera{font-family:'Line Awesome Brands';font-weight:400}.la.la-internet-explorer{font-family:'Line Awesome Brands';font-weight:400}.la.la-television:before{content:"\f26c"}.la.la-contao{font-family:'Line Awesome Brands';font-weight:400}.la.la-500px{font-family:'Line Awesome Brands';font-weight:400}.la.la-amazon{font-family:'Line Awesome Brands';font-weight:400}.la.la-calendar-plus-o{font-family:'Line Awesome Free';font-weight:400}.la.la-calendar-plus-o:before{content:"\f271"}.la.la-calendar-minus-o{font-family:'Line Awesome Free';font-weight:400}.la.la-calendar-minus-o:before{content:"\f272"}.la.la-calendar-times-o{font-family:'Line Awesome Free';font-weight:400}.la.la-calendar-times-o:before{content:"\f273"}.la.la-calendar-check-o{font-family:'Line Awesome Free';font-weight:400}.la.la-calendar-check-o:before{content:"\f274"}.la.la-map-o{font-family:'Line Awesome Free';font-weight:400}.la.la-map-o:before{content:"\f279"}.la.la-commenting:before{content:"\f4ad"}.la.la-commenting-o{font-family:'Line Awesome Free';font-weight:400}.la.la-commenting-o:before{content:"\f4ad"}.la.la-houzz{font-family:'Line Awesome Brands';font-weight:400}.la.la-vimeo{font-family:'Line Awesome Brands';font-weight:400}.la.la-vimeo:before{content:"\f27d"}.la.la-black-tie{font-family:'Line Awesome Brands';font-weight:400}.la.la-fonticons{font-family:'Line Awesome Brands';font-weight:400}.la.la-reddit-alien{font-family:'Line Awesome Brands';font-weight:400}.la.la-edge{font-family:'Line Awesome Brands';font-weight:400}.la.la-credit-card-alt:before{content:"\f09d"}.la.la-codiepie{font-family:'Line Awesome Brands';font-weight:400}.la.la-modx{font-family:'Line Awesome Brands';font-weight:400}.la.la-fort-awesome{font-family:'Line Awesome Brands';font-weight:400}.la.la-usb{font-family:'Line Awesome Brands';font-weight:400}.la.la-product-hunt{font-family:'Line Awesome Brands';font-weight:400}.la.la-mixcloud{font-family:'Line Awesome Brands';font-weight:400}.la.la-scribd{font-family:'Line Awesome Brands';font-weight:400}.la.la-pause-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-pause-circle-o:before{content:"\f28b"}.la.la-stop-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-stop-circle-o:before{content:"\f28d"}.la.la-bluetooth{font-family:'Line Awesome Brands';font-weight:400}.la.la-bluetooth-b{font-family:'Line Awesome Brands';font-weight:400}.la.la-gitlab{font-family:'Line Awesome Brands';font-weight:400}.la.la-wpbeginner{font-family:'Line Awesome Brands';font-weight:400}.la.la-wpforms{font-family:'Line Awesome Brands';font-weight:400}.la.la-envira{font-family:'Line Awesome Brands';font-weight:400}.la.la-wheelchair-alt{font-family:'Line Awesome Brands';font-weight:400}.la.la-wheelchair-alt:before{content:"\f368"}.la.la-question-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-question-circle-o:before{content:"\f059"}.la.la-volume-control-phone:before{content:"\f2a0"}.la.la-asl-interpreting:before{content:"\f2a3"}.la.la-deafness:before{content:"\f2a4"}.la.la-hard-of-hearing:before{content:"\f2a4"}.la.la-glide{font-family:'Line Awesome Brands';font-weight:400}.la.la-glide-g{font-family:'Line Awesome Brands';font-weight:400}.la.la-signing:before{content:"\f2a7"}.la.la-viadeo{font-family:'Line Awesome Brands';font-weight:400}.la.la-viadeo-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-snapchat{font-family:'Line Awesome Brands';font-weight:400}.la.la-snapchat-ghost{font-family:'Line Awesome Brands';font-weight:400}.la.la-snapchat-square{font-family:'Line Awesome Brands';font-weight:400}.la.la-pied-piper{font-family:'Line Awesome Brands';font-weight:400}.la.la-first-order{font-family:'Line Awesome Brands';font-weight:400}.la.la-yoast{font-family:'Line Awesome Brands';font-weight:400}.la.la-themeisle{font-family:'Line Awesome Brands';font-weight:400}.la.la-google-plus-official{font-family:'Line Awesome Brands';font-weight:400}.la.la-google-plus-official:before{content:"\f2b3"}.la.la-google-plus-circle{font-family:'Line Awesome Brands';font-weight:400}.la.la-google-plus-circle:before{content:"\f2b3"}.la.la-font-awesome{font-family:'Line Awesome Brands';font-weight:400}.la.la-fa{font-family:'Line Awesome Brands';font-weight:400}.la.la-fa:before{content:"\f2b4"}.la.la-handshake-o{font-family:'Line Awesome Free';font-weight:400}.la.la-handshake-o:before{content:"\f2b5"}.la.la-envelope-open-o{font-family:'Line Awesome Free';font-weight:400}.la.la-envelope-open-o:before{content:"\f2b6"}.la.la-linode{font-family:'Line Awesome Brands';font-weight:400}.la.la-address-book-o{font-family:'Line Awesome Free';font-weight:400}.la.la-address-book-o:before{content:"\f2b9"}.la.la-vcard:before{content:"\f2bb"}.la.la-address-card-o{font-family:'Line Awesome Free';font-weight:400}.la.la-address-card-o:before{content:"\f2bb"}.la.la-vcard-o{font-family:'Line Awesome Free';font-weight:400}.la.la-vcard-o:before{content:"\f2bb"}.la.la-user-circle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-user-circle-o:before{content:"\f2bd"}.la.la-user-o{font-family:'Line Awesome Free';font-weight:400}.la.la-user-o:before{content:"\f007"}.la.la-id-badge{font-family:'Line Awesome Free';font-weight:400}.la.la-drivers-license:before{content:"\f2c2"}.la.la-id-card-o{font-family:'Line Awesome Free';font-weight:400}.la.la-id-card-o:before{content:"\f2c2"}.la.la-drivers-license-o{font-family:'Line Awesome Free';font-weight:400}.la.la-drivers-license-o:before{content:"\f2c2"}.la.la-quora{font-family:'Line Awesome Brands';font-weight:400}.la.la-free-code-camp{font-family:'Line Awesome Brands';font-weight:400}.la.la-telegram{font-family:'Line Awesome Brands';font-weight:400}.la.la-thermometer-4:before{content:"\f2c7"}.la.la-thermometer:before{content:"\f2c7"}.la.la-thermometer-3:before{content:"\f2c8"}.la.la-thermometer-2:before{content:"\f2c9"}.la.la-thermometer-1:before{content:"\f2ca"}.la.la-thermometer-0:before{content:"\f2cb"}.la.la-bathtub:before{content:"\f2cd"}.la.la-s15:before{content:"\f2cd"}.la.la-window-maximize{font-family:'Line Awesome Free';font-weight:400}.la.la-window-restore{font-family:'Line Awesome Free';font-weight:400}.la.la-times-rectangle:before{content:"\f410"}.la.la-window-close-o{font-family:'Line Awesome Free';font-weight:400}.la.la-window-close-o:before{content:"\f410"}.la.la-times-rectangle-o{font-family:'Line Awesome Free';font-weight:400}.la.la-times-rectangle-o:before{content:"\f410"}.la.la-bandcamp{font-family:'Line Awesome Brands';font-weight:400}.la.la-grav{font-family:'Line Awesome Brands';font-weight:400}.la.la-etsy{font-family:'Line Awesome Brands';font-weight:400}.la.la-imdb{font-family:'Line Awesome Brands';font-weight:400}.la.la-ravelry{font-family:'Line Awesome Brands';font-weight:400}.la.la-eercast{font-family:'Line Awesome Brands';font-weight:400}.la.la-eercast:before{content:"\f2da"}.la.la-snowflake-o{font-family:'Line Awesome Free';font-weight:400}.la.la-snowflake-o:before{content:"\f2dc"}.la.la-superpowers{font-family:'Line Awesome Brands';font-weight:400}.la.la-wpexplorer{font-family:'Line Awesome Brands';font-weight:400}.la.la-spotify{font-family:'Line Awesome Brands';font-weight:400} diff --git a/python/static/css/style.css b/python/static/css/style.css deleted file mode 100644 index 67b876c..0000000 --- a/python/static/css/style.css +++ /dev/null @@ -1,159 +0,0 @@ -body { - background-color: #f5f5f5; - background-image: url('/static/img/bg.png'); - background-size: cover; -} - -.align-center { - vertical-align: middle; - text-align: center; -} - -/* Layout */ -.centered { - position: fixed; - text-align: center; - top: 50%; - left: 50%; - transform: translate(-50%, -50%) !important; -} - -#disk { - width: 66vw; - border-radius: 1200px; - aspect-ratio: 1 / 1 !important; - background-image: url('/static/img/vinyl.png'); - background-position: center; - background-size: cover; -} - -.card { - box-shadow: 0 0 36px 0px rgba(128, 128, 128, 0.128); - background-color: white; - padding: 32px; - border-radius: 20px; -} - -.modal-body { - background-color: #f5f5f5; -} - -.navbar-avatar { - max-height: 40px; - border-radius: 30px; - height: 40px; -} - -.main-menu-link { - /*font-size: 24px;*/ - /*font-family: RobotoSlab;*/ -} - -a { - text-decoration: none; - transition: 0.3s; -} - -#header { - position: fixed; - top: 0; - width: 100%; -} - -#action_list { - float: right; - padding: 20px; - color: white; - position: fixed; - right: 0; -} - -#action_list a { - color: white; -} - -#logo { - display: flex; - align-items: baseline; -} - -#search_bar { - background: url('../svg/search-solid.svg') no-repeat scroll 12px 7px; - padding-left: 48px; - background-size: 20px; - border-radius: 66px; -} - -#navigation { - /*padding-top: 32px;*/ -} - -.navbar { - padding-left: 12px; - padding-right: 12px; -} - -#navigation_logo { - max-width: 216px; -} - -#content { - min-height: 100vh; -} - -#footer { - text-align: center; - position: fixed; - bottom: 0; - width: 100%; -} - -.logo { - width: 100%; -} - -.dl_queue_img { - position: relative; -} - -.icn-spinner { - animation: spin-animation 0.9s infinite; - display: inline-block; -} - -.icn-downloading { - top: 50%; - left: 50%; - position: absolute; - transform: translate(-50%, -50%); -} - -.vinyl-card { - background-image: url('/static/img/vinyl-card.png'); - background-position: right; - border-radius: 20px; -} - -@keyframes spin-animation { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(359deg); - } -} - -@keyframes spin{ - from{transform:rotate(0deg)} - to{transform:rotate(360deg)} -} - -@-webkit-keyframes spin { - from {-webkit-transform:rotate(0deg);} - to { -webkit-transform:rotate(360deg);} -} - -@-moz-keyframes spin { - from {-moz-transform:rotate(0deg);} - to { -moz-transform:rotate(360deg);} -} \ No newline at end of file diff --git a/python/static/favicon.svg b/python/static/favicon.svg deleted file mode 100755 index 11969e7..0000000 --- a/python/static/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/fonts/la-brands-400.eot b/python/static/fonts/la-brands-400.eot deleted file mode 100644 index 81969f5..0000000 Binary files a/python/static/fonts/la-brands-400.eot and /dev/null differ diff --git a/python/static/fonts/la-brands-400.svg b/python/static/fonts/la-brands-400.svg deleted file mode 100644 index b903f64..0000000 --- a/python/static/fonts/la-brands-400.svg +++ /dev/null @@ -1,1313 +0,0 @@ - - - -Created by Icons8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/python/static/fonts/la-brands-400.ttf b/python/static/fonts/la-brands-400.ttf deleted file mode 100644 index 6cd243d..0000000 Binary files a/python/static/fonts/la-brands-400.ttf and /dev/null differ diff --git a/python/static/fonts/la-brands-400.woff b/python/static/fonts/la-brands-400.woff deleted file mode 100644 index 32f7df4..0000000 Binary files a/python/static/fonts/la-brands-400.woff and /dev/null differ diff --git a/python/static/fonts/la-brands-400.woff2 b/python/static/fonts/la-brands-400.woff2 deleted file mode 100644 index 5177028..0000000 Binary files a/python/static/fonts/la-brands-400.woff2 and /dev/null differ diff --git a/python/static/fonts/la-regular-400.eot b/python/static/fonts/la-regular-400.eot deleted file mode 100644 index a93a4a2..0000000 Binary files a/python/static/fonts/la-regular-400.eot and /dev/null differ diff --git a/python/static/fonts/la-regular-400.svg b/python/static/fonts/la-regular-400.svg deleted file mode 100644 index 43b8602..0000000 --- a/python/static/fonts/la-regular-400.svg +++ /dev/null @@ -1,467 +0,0 @@ - - - -Created by Icons8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/python/static/fonts/la-regular-400.ttf b/python/static/fonts/la-regular-400.ttf deleted file mode 100644 index 226653f..0000000 Binary files a/python/static/fonts/la-regular-400.ttf and /dev/null differ diff --git a/python/static/fonts/la-regular-400.woff b/python/static/fonts/la-regular-400.woff deleted file mode 100644 index 3010f91..0000000 Binary files a/python/static/fonts/la-regular-400.woff and /dev/null differ diff --git a/python/static/fonts/la-regular-400.woff2 b/python/static/fonts/la-regular-400.woff2 deleted file mode 100644 index f7dab5d..0000000 Binary files a/python/static/fonts/la-regular-400.woff2 and /dev/null differ diff --git a/python/static/fonts/la-solid-900.eot b/python/static/fonts/la-solid-900.eot deleted file mode 100644 index d739c05..0000000 Binary files a/python/static/fonts/la-solid-900.eot and /dev/null differ diff --git a/python/static/fonts/la-solid-900.svg b/python/static/fonts/la-solid-900.svg deleted file mode 100644 index 02fc485..0000000 --- a/python/static/fonts/la-solid-900.svg +++ /dev/null @@ -1,2894 +0,0 @@ - - - -Created by Icons8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/python/static/fonts/la-solid-900.ttf b/python/static/fonts/la-solid-900.ttf deleted file mode 100644 index e0ec957..0000000 Binary files a/python/static/fonts/la-solid-900.ttf and /dev/null differ diff --git a/python/static/fonts/la-solid-900.woff b/python/static/fonts/la-solid-900.woff deleted file mode 100644 index 26a5134..0000000 Binary files a/python/static/fonts/la-solid-900.woff and /dev/null differ diff --git a/python/static/fonts/la-solid-900.woff2 b/python/static/fonts/la-solid-900.woff2 deleted file mode 100644 index 22e909c..0000000 Binary files a/python/static/fonts/la-solid-900.woff2 and /dev/null differ diff --git a/python/static/img/bg.png b/python/static/img/bg.png deleted file mode 100644 index 0267986..0000000 Binary files a/python/static/img/bg.png and /dev/null differ diff --git a/python/static/img/vinyl-card.jpg b/python/static/img/vinyl-card.jpg deleted file mode 100644 index b2c74cc..0000000 Binary files a/python/static/img/vinyl-card.jpg and /dev/null differ diff --git a/python/static/img/vinyl-card.png b/python/static/img/vinyl-card.png deleted file mode 100644 index d5184b5..0000000 Binary files a/python/static/img/vinyl-card.png and /dev/null differ diff --git a/python/static/img/vinyl-card.xcf b/python/static/img/vinyl-card.xcf deleted file mode 100644 index edc65bc..0000000 Binary files a/python/static/img/vinyl-card.xcf and /dev/null differ diff --git a/python/static/img/vinyl.png b/python/static/img/vinyl.png deleted file mode 100644 index 36fbcc1..0000000 Binary files a/python/static/img/vinyl.png and /dev/null differ diff --git a/python/static/img/vinyl.xcf b/python/static/img/vinyl.xcf deleted file mode 100644 index 9957345..0000000 Binary files a/python/static/img/vinyl.xcf and /dev/null differ diff --git a/python/static/js/app.js b/python/static/js/app.js deleted file mode 100644 index e632ae4..0000000 --- a/python/static/js/app.js +++ /dev/null @@ -1,60 +0,0 @@ -const appModal = $('#modalDownloadQueue'); -const appModalContent = $('#modal_content'); -let modalPolling = false; - -function proc_notification(icon, title, text) { - Swal.fire({ - title: title, - icon: icon, - text: text - }) -} - -function fill_download_queue() { - $.ajax({ - url: '/api/v1/get/queue' - }).done((res) => { - appModalContent.html(res); - }) -} - -$('.settings_btn').on('click', () => { - $('#modalSettings').modal('toggle'); -}) - -$('.queue_btn').on('click', () => { - console.log('Get Queue!'); - if (modalPolling) { - clearInterval(modalPolling); - } - fill_download_queue(); - modalPolling = setInterval(fill_download_queue, 12000); - appModal.modal('toggle'); -}) - -$('#download_btn').on('click', () => { - let artist = $('#search_bar').val(); - // Prevent - $('#search_bar').val(''); - let icon = 'error'; - let title = 'What the flip?!'; - let text = 'You need to add an artist bro..'; - - if (artist) { - $("#loader-wrapper").fadeIn(300); - $.ajax({ - url: `/api/v1/get/artist/${artist}`, - }).done(function (res) { - text = res.message; - if (res.status === 200) { - icon = 'success'; - title = 'Shazam!'; - } - $("#loader-wrapper").fadeOut(700); - proc_notification(icon, title, text); - }); - } else { - proc_notification(icon, title, text); - } - -}) \ No newline at end of file diff --git a/python/static/line-awesome.fig b/python/static/line-awesome.fig deleted file mode 100755 index d89a064..0000000 Binary files a/python/static/line-awesome.fig and /dev/null differ diff --git a/python/static/scss/_bordered_pulled.scss b/python/static/scss/_bordered_pulled.scss deleted file mode 100644 index 6aca7dd..0000000 --- a/python/static/scss/_bordered_pulled.scss +++ /dev/null @@ -1,21 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$la-css-prefix}-border { - border: solid 0.08em #eee; - border-radius: .1em; - padding: .2em .25em .15em; -} - -.#{$la-css-prefix}-pull-left { float: left; } -.#{$la-css-prefix}-pull-right { float: right; } - -.#{$la-css-prefix} { - &.#{$la-css-prefix}-pull-left { margin-right: .3em; } - &.#{$la-css-prefix}-pull-right { margin-left: .3em; } -} - -.#{$la-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/python/static/scss/_core.scss b/python/static/scss/_core.scss deleted file mode 100644 index df86d3a..0000000 --- a/python/static/scss/_core.scss +++ /dev/null @@ -1,11 +0,0 @@ -.lar, -.las, -.lab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; -} diff --git a/python/static/scss/_fixed-width.scss b/python/static/scss/_fixed-width.scss deleted file mode 100644 index 2fda512..0000000 --- a/python/static/scss/_fixed-width.scss +++ /dev/null @@ -1,4 +0,0 @@ -.#{$la-css-prefix}-fw { - width: 1.25em; - text-align: center; -} diff --git a/python/static/scss/_icons.scss b/python/static/scss/_icons.scss deleted file mode 100644 index 4c04040..0000000 --- a/python/static/scss/_icons.scss +++ /dev/null @@ -1,1393 +0,0 @@ -.#{$la-css-prefix}-500px:before { content: la-content($la-500px); } -.#{$la-css-prefix}-accessible-icon:before { content: la-content($la-accessible-icon); } -.#{$la-css-prefix}-accusoft:before { content: la-content($la-accusoft); } -.#{$la-css-prefix}-acquisitions-incorporated:before { content: la-content($la-acquisitions-incorporated); } -.#{$la-css-prefix}-ad:before { content: la-content($la-ad); } -.#{$la-css-prefix}-address-book:before { content: la-content($la-address-book); } -.#{$la-css-prefix}-address-card:before { content: la-content($la-address-card); } -.#{$la-css-prefix}-adjust:before { content: la-content($la-adjust); } -.#{$la-css-prefix}-adn:before { content: la-content($la-adn); } -.#{$la-css-prefix}-adobe:before { content: la-content($la-adobe); } -.#{$la-css-prefix}-adversal:before { content: la-content($la-adversal); } -.#{$la-css-prefix}-affiliatetheme:before { content: la-content($la-affiliatetheme); } -.#{$la-css-prefix}-air-freshener:before { content: la-content($la-air-freshener); } -.#{$la-css-prefix}-airbnb:before { content: la-content($la-airbnb); } -.#{$la-css-prefix}-algolia:before { content: la-content($la-algolia); } -.#{$la-css-prefix}-align-center:before { content: la-content($la-align-center); } -.#{$la-css-prefix}-align-justify:before { content: la-content($la-align-justify); } -.#{$la-css-prefix}-align-left:before { content: la-content($la-align-left); } -.#{$la-css-prefix}-align-right:before { content: la-content($la-align-right); } -.#{$la-css-prefix}-alipay:before { content: la-content($la-alipay); } -.#{$la-css-prefix}-allergies:before { content: la-content($la-allergies); } -.#{$la-css-prefix}-amazon:before { content: la-content($la-amazon); } -.#{$la-css-prefix}-amazon-pay:before { content: la-content($la-amazon-pay); } -.#{$la-css-prefix}-ambulance:before { content: la-content($la-ambulance); } -.#{$la-css-prefix}-american-sign-language-interpreting:before { content: la-content($la-american-sign-language-interpreting); } -.#{$la-css-prefix}-amilia:before { content: la-content($la-amilia); } -.#{$la-css-prefix}-anchor:before { content: la-content($la-anchor); } -.#{$la-css-prefix}-android:before { content: la-content($la-android); } -.#{$la-css-prefix}-angellist:before { content: la-content($la-angellist); } -.#{$la-css-prefix}-angle-double-down:before { content: la-content($la-angle-double-down); } -.#{$la-css-prefix}-angle-double-left:before { content: la-content($la-angle-double-left); } -.#{$la-css-prefix}-angle-double-right:before { content: la-content($la-angle-double-right); } -.#{$la-css-prefix}-angle-double-up:before { content: la-content($la-angle-double-up); } -.#{$la-css-prefix}-angle-down:before { content: la-content($la-angle-down); } -.#{$la-css-prefix}-angle-left:before { content: la-content($la-angle-left); } -.#{$la-css-prefix}-angle-right:before { content: la-content($la-angle-right); } -.#{$la-css-prefix}-angle-up:before { content: la-content($la-angle-up); } -.#{$la-css-prefix}-angry:before { content: la-content($la-angry); } -.#{$la-css-prefix}-angrycreative:before { content: la-content($la-angrycreative); } -.#{$la-css-prefix}-angular:before { content: la-content($la-angular); } -.#{$la-css-prefix}-ankh:before { content: la-content($la-ankh); } -.#{$la-css-prefix}-app-store:before { content: la-content($la-app-store); } -.#{$la-css-prefix}-app-store-ios:before { content: la-content($la-app-store-ios); } -.#{$la-css-prefix}-apper:before { content: la-content($la-apper); } -.#{$la-css-prefix}-apple:before { content: la-content($la-apple); } -.#{$la-css-prefix}-apple-alt:before { content: la-content($la-apple-alt); } -.#{$la-css-prefix}-apple-pay:before { content: la-content($la-apple-pay); } -.#{$la-css-prefix}-archive:before { content: la-content($la-archive); } -.#{$la-css-prefix}-archway:before { content: la-content($la-archway); } -.#{$la-css-prefix}-arrow-alt-circle-down:before { content: la-content($la-arrow-alt-circle-down); } -.#{$la-css-prefix}-arrow-alt-circle-left:before { content: la-content($la-arrow-alt-circle-left); } -.#{$la-css-prefix}-arrow-alt-circle-right:before { content: la-content($la-arrow-alt-circle-right); } -.#{$la-css-prefix}-arrow-alt-circle-up:before { content: la-content($la-arrow-alt-circle-up); } -.#{$la-css-prefix}-arrow-circle-down:before { content: la-content($la-arrow-circle-down); } -.#{$la-css-prefix}-arrow-circle-left:before { content: la-content($la-arrow-circle-left); } -.#{$la-css-prefix}-arrow-circle-right:before { content: la-content($la-arrow-circle-right); } -.#{$la-css-prefix}-arrow-circle-up:before { content: la-content($la-arrow-circle-up); } -.#{$la-css-prefix}-arrow-down:before { content: la-content($la-arrow-down); } -.#{$la-css-prefix}-arrow-left:before { content: la-content($la-arrow-left); } -.#{$la-css-prefix}-arrow-right:before { content: la-content($la-arrow-right); } -.#{$la-css-prefix}-arrow-up:before { content: la-content($la-arrow-up); } -.#{$la-css-prefix}-arrows-alt:before { content: la-content($la-arrows-alt); } -.#{$la-css-prefix}-arrows-alt-h:before { content: la-content($la-arrows-alt-h); } -.#{$la-css-prefix}-arrows-alt-v:before { content: la-content($la-arrows-alt-v); } -.#{$la-css-prefix}-artstation:before { content: la-content($la-artstation); } -.#{$la-css-prefix}-assistive-listening-systems:before { content: la-content($la-assistive-listening-systems); } -.#{$la-css-prefix}-asterisk:before { content: la-content($la-asterisk); } -.#{$la-css-prefix}-asymmetrik:before { content: la-content($la-asymmetrik); } -.#{$la-css-prefix}-at:before { content: la-content($la-at); } -.#{$la-css-prefix}-atlas:before { content: la-content($la-atlas); } -.#{$la-css-prefix}-atlassian:before { content: la-content($la-atlassian); } -.#{$la-css-prefix}-atom:before { content: la-content($la-atom); } -.#{$la-css-prefix}-audible:before { content: la-content($la-audible); } -.#{$la-css-prefix}-audio-description:before { content: la-content($la-audio-description); } -.#{$la-css-prefix}-autoprefixer:before { content: la-content($la-autoprefixer); } -.#{$la-css-prefix}-avianex:before { content: la-content($la-avianex); } -.#{$la-css-prefix}-aviato:before { content: la-content($la-aviato); } -.#{$la-css-prefix}-award:before { content: la-content($la-award); } -.#{$la-css-prefix}-aws:before { content: la-content($la-aws); } -.#{$la-css-prefix}-baby:before { content: la-content($la-baby); } -.#{$la-css-prefix}-baby-carriage:before { content: la-content($la-baby-carriage); } -.#{$la-css-prefix}-backspace:before { content: la-content($la-backspace); } -.#{$la-css-prefix}-backward:before { content: la-content($la-backward); } -.#{$la-css-prefix}-bacon:before { content: la-content($la-bacon); } -.#{$la-css-prefix}-balance-scale:before { content: la-content($la-balance-scale); } -.#{$la-css-prefix}-balance-scale-left:before { content: la-content($la-balance-scale-left); } -.#{$la-css-prefix}-balance-scale-right:before { content: la-content($la-balance-scale-right); } -.#{$la-css-prefix}-ban:before { content: la-content($la-ban); } -.#{$la-css-prefix}-band-aid:before { content: la-content($la-band-aid); } -.#{$la-css-prefix}-bandcamp:before { content: la-content($la-bandcamp); } -.#{$la-css-prefix}-barcode:before { content: la-content($la-barcode); } -.#{$la-css-prefix}-bars:before { content: la-content($la-bars); } -.#{$la-css-prefix}-baseball-ball:before { content: la-content($la-baseball-ball); } -.#{$la-css-prefix}-basketball-ball:before { content: la-content($la-basketball-ball); } -.#{$la-css-prefix}-bath:before { content: la-content($la-bath); } -.#{$la-css-prefix}-battery-empty:before { content: la-content($la-battery-empty); } -.#{$la-css-prefix}-battery-full:before { content: la-content($la-battery-full); } -.#{$la-css-prefix}-battery-half:before { content: la-content($la-battery-half); } -.#{$la-css-prefix}-battery-quarter:before { content: la-content($la-battery-quarter); } -.#{$la-css-prefix}-battery-three-quarters:before { content: la-content($la-battery-three-quarters); } -.#{$la-css-prefix}-battle-net:before { content: la-content($la-battle-net); } -.#{$la-css-prefix}-bed:before { content: la-content($la-bed); } -.#{$la-css-prefix}-beer:before { content: la-content($la-beer); } -.#{$la-css-prefix}-behance:before { content: la-content($la-behance); } -.#{$la-css-prefix}-behance-square:before { content: la-content($la-behance-square); } -.#{$la-css-prefix}-bell:before { content: la-content($la-bell); } -.#{$la-css-prefix}-bell-slash:before { content: la-content($la-bell-slash); } -.#{$la-css-prefix}-bezier-curve:before { content: la-content($la-bezier-curve); } -.#{$la-css-prefix}-bible:before { content: la-content($la-bible); } -.#{$la-css-prefix}-bicycle:before { content: la-content($la-bicycle); } -.#{$la-css-prefix}-biking:before { content: la-content($la-biking); } -.#{$la-css-prefix}-bimobject:before { content: la-content($la-bimobject); } -.#{$la-css-prefix}-binoculars:before { content: la-content($la-binoculars); } -.#{$la-css-prefix}-biohazard:before { content: la-content($la-biohazard); } -.#{$la-css-prefix}-birthday-cake:before { content: la-content($la-birthday-cake); } -.#{$la-css-prefix}-bitbucket:before { content: la-content($la-bitbucket); } -.#{$la-css-prefix}-bitcoin:before { content: la-content($la-bitcoin); } -.#{$la-css-prefix}-bity:before { content: la-content($la-bity); } -.#{$la-css-prefix}-black-tie:before { content: la-content($la-black-tie); } -.#{$la-css-prefix}-blackberry:before { content: la-content($la-blackberry); } -.#{$la-css-prefix}-blender:before { content: la-content($la-blender); } -.#{$la-css-prefix}-blender-phone:before { content: la-content($la-blender-phone); } -.#{$la-css-prefix}-blind:before { content: la-content($la-blind); } -.#{$la-css-prefix}-blog:before { content: la-content($la-blog); } -.#{$la-css-prefix}-blogger:before { content: la-content($la-blogger); } -.#{$la-css-prefix}-blogger-b:before { content: la-content($la-blogger-b); } -.#{$la-css-prefix}-bluetooth:before { content: la-content($la-bluetooth); } -.#{$la-css-prefix}-bluetooth-b:before { content: la-content($la-bluetooth-b); } -.#{$la-css-prefix}-bold:before { content: la-content($la-bold); } -.#{$la-css-prefix}-bolt:before { content: la-content($la-bolt); } -.#{$la-css-prefix}-bomb:before { content: la-content($la-bomb); } -.#{$la-css-prefix}-bone:before { content: la-content($la-bone); } -.#{$la-css-prefix}-bong:before { content: la-content($la-bong); } -.#{$la-css-prefix}-book:before { content: la-content($la-book); } -.#{$la-css-prefix}-book-dead:before { content: la-content($la-book-dead); } -.#{$la-css-prefix}-book-medical:before { content: la-content($la-book-medical); } -.#{$la-css-prefix}-book-open:before { content: la-content($la-book-open); } -.#{$la-css-prefix}-book-reader:before { content: la-content($la-book-reader); } -.#{$la-css-prefix}-bookmark:before { content: la-content($la-bookmark); } -.#{$la-css-prefix}-bootstrap:before { content: la-content($la-bootstrap); } -.#{$la-css-prefix}-border-all:before { content: la-content($la-border-all); } -.#{$la-css-prefix}-border-none:before { content: la-content($la-border-none); } -.#{$la-css-prefix}-border-style:before { content: la-content($la-border-style); } -.#{$la-css-prefix}-bowling-ball:before { content: la-content($la-bowling-ball); } -.#{$la-css-prefix}-box:before { content: la-content($la-box); } -.#{$la-css-prefix}-box-open:before { content: la-content($la-box-open); } -.#{$la-css-prefix}-boxes:before { content: la-content($la-boxes); } -.#{$la-css-prefix}-braille:before { content: la-content($la-braille); } -.#{$la-css-prefix}-brain:before { content: la-content($la-brain); } -.#{$la-css-prefix}-bread-slice:before { content: la-content($la-bread-slice); } -.#{$la-css-prefix}-briefcase:before { content: la-content($la-briefcase); } -.#{$la-css-prefix}-briefcase-medical:before { content: la-content($la-briefcase-medical); } -.#{$la-css-prefix}-broadcast-tower:before { content: la-content($la-broadcast-tower); } -.#{$la-css-prefix}-broom:before { content: la-content($la-broom); } -.#{$la-css-prefix}-brush:before { content: la-content($la-brush); } -.#{$la-css-prefix}-btc:before { content: la-content($la-btc); } -.#{$la-css-prefix}-buffer:before { content: la-content($la-buffer); } -.#{$la-css-prefix}-bug:before { content: la-content($la-bug); } -.#{$la-css-prefix}-building:before { content: la-content($la-building); } -.#{$la-css-prefix}-bullhorn:before { content: la-content($la-bullhorn); } -.#{$la-css-prefix}-bullseye:before { content: la-content($la-bullseye); } -.#{$la-css-prefix}-burn:before { content: la-content($la-burn); } -.#{$la-css-prefix}-buromobelexperte:before { content: la-content($la-buromobelexperte); } -.#{$la-css-prefix}-bus:before { content: la-content($la-bus); } -.#{$la-css-prefix}-bus-alt:before { content: la-content($la-bus-alt); } -.#{$la-css-prefix}-business-time:before { content: la-content($la-business-time); } -.#{$la-css-prefix}-buysellads:before { content: la-content($la-buysellads); } -.#{$la-css-prefix}-calculator:before { content: la-content($la-calculator); } -.#{$la-css-prefix}-calendar:before { content: la-content($la-calendar); } -.#{$la-css-prefix}-calendar-alt:before { content: la-content($la-calendar-alt); } -.#{$la-css-prefix}-calendar-check:before { content: la-content($la-calendar-check); } -.#{$la-css-prefix}-calendar-day:before { content: la-content($la-calendar-day); } -.#{$la-css-prefix}-calendar-minus:before { content: la-content($la-calendar-minus); } -.#{$la-css-prefix}-calendar-plus:before { content: la-content($la-calendar-plus); } -.#{$la-css-prefix}-calendar-times:before { content: la-content($la-calendar-times); } -.#{$la-css-prefix}-calendar-week:before { content: la-content($la-calendar-week); } -.#{$la-css-prefix}-camera:before { content: la-content($la-camera); } -.#{$la-css-prefix}-camera-retro:before { content: la-content($la-camera-retro); } -.#{$la-css-prefix}-campground:before { content: la-content($la-campground); } -.#{$la-css-prefix}-canadian-maple-leaf:before { content: la-content($la-canadian-maple-leaf); } -.#{$la-css-prefix}-candy-cane:before { content: la-content($la-candy-cane); } -.#{$la-css-prefix}-cannabis:before { content: la-content($la-cannabis); } -.#{$la-css-prefix}-capsules:before { content: la-content($la-capsules); } -.#{$la-css-prefix}-car:before { content: la-content($la-car); } -.#{$la-css-prefix}-car-alt:before { content: la-content($la-car-alt); } -.#{$la-css-prefix}-car-battery:before { content: la-content($la-car-battery); } -.#{$la-css-prefix}-car-crash:before { content: la-content($la-car-crash); } -.#{$la-css-prefix}-car-side:before { content: la-content($la-car-side); } -.#{$la-css-prefix}-caret-down:before { content: la-content($la-caret-down); } -.#{$la-css-prefix}-caret-left:before { content: la-content($la-caret-left); } -.#{$la-css-prefix}-caret-right:before { content: la-content($la-caret-right); } -.#{$la-css-prefix}-caret-square-down:before { content: la-content($la-caret-square-down); } -.#{$la-css-prefix}-caret-square-left:before { content: la-content($la-caret-square-left); } -.#{$la-css-prefix}-caret-square-right:before { content: la-content($la-caret-square-right); } -.#{$la-css-prefix}-caret-square-up:before { content: la-content($la-caret-square-up); } -.#{$la-css-prefix}-caret-up:before { content: la-content($la-caret-up); } -.#{$la-css-prefix}-carrot:before { content: la-content($la-carrot); } -.#{$la-css-prefix}-cart-arrow-down:before { content: la-content($la-cart-arrow-down); } -.#{$la-css-prefix}-cart-plus:before { content: la-content($la-cart-plus); } -.#{$la-css-prefix}-cash-register:before { content: la-content($la-cash-register); } -.#{$la-css-prefix}-cat:before { content: la-content($la-cat); } -.#{$la-css-prefix}-cc-amazon-pay:before { content: la-content($la-cc-amazon-pay); } -.#{$la-css-prefix}-cc-amex:before { content: la-content($la-cc-amex); } -.#{$la-css-prefix}-cc-apple-pay:before { content: la-content($la-cc-apple-pay); } -.#{$la-css-prefix}-cc-diners-club:before { content: la-content($la-cc-diners-club); } -.#{$la-css-prefix}-cc-discover:before { content: la-content($la-cc-discover); } -.#{$la-css-prefix}-cc-jcb:before { content: la-content($la-cc-jcb); } -.#{$la-css-prefix}-cc-mastercard:before { content: la-content($la-cc-mastercard); } -.#{$la-css-prefix}-cc-paypal:before { content: la-content($la-cc-paypal); } -.#{$la-css-prefix}-cc-stripe:before { content: la-content($la-cc-stripe); } -.#{$la-css-prefix}-cc-visa:before { content: la-content($la-cc-visa); } -.#{$la-css-prefix}-centercode:before { content: la-content($la-centercode); } -.#{$la-css-prefix}-centos:before { content: la-content($la-centos); } -.#{$la-css-prefix}-certificate:before { content: la-content($la-certificate); } -.#{$la-css-prefix}-chair:before { content: la-content($la-chair); } -.#{$la-css-prefix}-chalkboard:before { content: la-content($la-chalkboard); } -.#{$la-css-prefix}-chalkboard-teacher:before { content: la-content($la-chalkboard-teacher); } -.#{$la-css-prefix}-charging-station:before { content: la-content($la-charging-station); } -.#{$la-css-prefix}-chart-area:before { content: la-content($la-chart-area); } -.#{$la-css-prefix}-chart-bar:before { content: la-content($la-chart-bar); } -.#{$la-css-prefix}-chart-line:before { content: la-content($la-chart-line); } -.#{$la-css-prefix}-chart-pie:before { content: la-content($la-chart-pie); } -.#{$la-css-prefix}-check:before { content: la-content($la-check); } -.#{$la-css-prefix}-check-circle:before { content: la-content($la-check-circle); } -.#{$la-css-prefix}-check-double:before { content: la-content($la-check-double); } -.#{$la-css-prefix}-check-square:before { content: la-content($la-check-square); } -.#{$la-css-prefix}-cheese:before { content: la-content($la-cheese); } -.#{$la-css-prefix}-chess:before { content: la-content($la-chess); } -.#{$la-css-prefix}-chess-bishop:before { content: la-content($la-chess-bishop); } -.#{$la-css-prefix}-chess-board:before { content: la-content($la-chess-board); } -.#{$la-css-prefix}-chess-king:before { content: la-content($la-chess-king); } -.#{$la-css-prefix}-chess-knight:before { content: la-content($la-chess-knight); } -.#{$la-css-prefix}-chess-pawn:before { content: la-content($la-chess-pawn); } -.#{$la-css-prefix}-chess-queen:before { content: la-content($la-chess-queen); } -.#{$la-css-prefix}-chess-rook:before { content: la-content($la-chess-rook); } -.#{$la-css-prefix}-chevron-circle-down:before { content: la-content($la-chevron-circle-down); } -.#{$la-css-prefix}-chevron-circle-left:before { content: la-content($la-chevron-circle-left); } -.#{$la-css-prefix}-chevron-circle-right:before { content: la-content($la-chevron-circle-right); } -.#{$la-css-prefix}-chevron-circle-up:before { content: la-content($la-chevron-circle-up); } -.#{$la-css-prefix}-chevron-down:before { content: la-content($la-chevron-down); } -.#{$la-css-prefix}-chevron-left:before { content: la-content($la-chevron-left); } -.#{$la-css-prefix}-chevron-right:before { content: la-content($la-chevron-right); } -.#{$la-css-prefix}-chevron-up:before { content: la-content($la-chevron-up); } -.#{$la-css-prefix}-child:before { content: la-content($la-child); } -.#{$la-css-prefix}-chrome:before { content: la-content($la-chrome); } -.#{$la-css-prefix}-chromecast:before { content: la-content($la-chromecast); } -.#{$la-css-prefix}-church:before { content: la-content($la-church); } -.#{$la-css-prefix}-circle:before { content: la-content($la-circle); } -.#{$la-css-prefix}-circle-notch:before { content: la-content($la-circle-notch); } -.#{$la-css-prefix}-city:before { content: la-content($la-city); } -.#{$la-css-prefix}-clinic-medical:before { content: la-content($la-clinic-medical); } -.#{$la-css-prefix}-clipboard:before { content: la-content($la-clipboard); } -.#{$la-css-prefix}-clipboard-check:before { content: la-content($la-clipboard-check); } -.#{$la-css-prefix}-clipboard-list:before { content: la-content($la-clipboard-list); } -.#{$la-css-prefix}-clock:before { content: la-content($la-clock); } -.#{$la-css-prefix}-clone:before { content: la-content($la-clone); } -.#{$la-css-prefix}-closed-captioning:before { content: la-content($la-closed-captioning); } -.#{$la-css-prefix}-cloud:before { content: la-content($la-cloud); } -.#{$la-css-prefix}-cloud-download-alt:before { content: la-content($la-cloud-download-alt); } -.#{$la-css-prefix}-cloud-meatball:before { content: la-content($la-cloud-meatball); } -.#{$la-css-prefix}-cloud-moon:before { content: la-content($la-cloud-moon); } -.#{$la-css-prefix}-cloud-moon-rain:before { content: la-content($la-cloud-moon-rain); } -.#{$la-css-prefix}-cloud-rain:before { content: la-content($la-cloud-rain); } -.#{$la-css-prefix}-cloud-showers-heavy:before { content: la-content($la-cloud-showers-heavy); } -.#{$la-css-prefix}-cloud-sun:before { content: la-content($la-cloud-sun); } -.#{$la-css-prefix}-cloud-sun-rain:before { content: la-content($la-cloud-sun-rain); } -.#{$la-css-prefix}-cloud-upload-alt:before { content: la-content($la-cloud-upload-alt); } -.#{$la-css-prefix}-cloudscale:before { content: la-content($la-cloudscale); } -.#{$la-css-prefix}-cloudsmith:before { content: la-content($la-cloudsmith); } -.#{$la-css-prefix}-cloudversify:before { content: la-content($la-cloudversify); } -.#{$la-css-prefix}-cocktail:before { content: la-content($la-cocktail); } -.#{$la-css-prefix}-code:before { content: la-content($la-code); } -.#{$la-css-prefix}-code-branch:before { content: la-content($la-code-branch); } -.#{$la-css-prefix}-codepen:before { content: la-content($la-codepen); } -.#{$la-css-prefix}-codiepie:before { content: la-content($la-codiepie); } -.#{$la-css-prefix}-coffee:before { content: la-content($la-coffee); } -.#{$la-css-prefix}-cog:before { content: la-content($la-cog); } -.#{$la-css-prefix}-cogs:before { content: la-content($la-cogs); } -.#{$la-css-prefix}-coins:before { content: la-content($la-coins); } -.#{$la-css-prefix}-columns:before { content: la-content($la-columns); } -.#{$la-css-prefix}-comment:before { content: la-content($la-comment); } -.#{$la-css-prefix}-comment-alt:before { content: la-content($la-comment-alt); } -.#{$la-css-prefix}-comment-dollar:before { content: la-content($la-comment-dollar); } -.#{$la-css-prefix}-comment-dots:before { content: la-content($la-comment-dots); } -.#{$la-css-prefix}-comment-medical:before { content: la-content($la-comment-medical); } -.#{$la-css-prefix}-comment-slash:before { content: la-content($la-comment-slash); } -.#{$la-css-prefix}-comments:before { content: la-content($la-comments); } -.#{$la-css-prefix}-comments-dollar:before { content: la-content($la-comments-dollar); } -.#{$la-css-prefix}-compact-disc:before { content: la-content($la-compact-disc); } -.#{$la-css-prefix}-compass:before { content: la-content($la-compass); } -.#{$la-css-prefix}-compress:before { content: la-content($la-compress); } -.#{$la-css-prefix}-compress-arrows-alt:before { content: la-content($la-compress-arrows-alt); } -.#{$la-css-prefix}-concierge-bell:before { content: la-content($la-concierge-bell); } -.#{$la-css-prefix}-confluence:before { content: la-content($la-confluence); } -.#{$la-css-prefix}-connectdevelop:before { content: la-content($la-connectdevelop); } -.#{$la-css-prefix}-contao:before { content: la-content($la-contao); } -.#{$la-css-prefix}-cookie:before { content: la-content($la-cookie); } -.#{$la-css-prefix}-cookie-bite:before { content: la-content($la-cookie-bite); } -.#{$la-css-prefix}-copy:before { content: la-content($la-copy); } -.#{$la-css-prefix}-copyright:before { content: la-content($la-copyright); } -.#{$la-css-prefix}-cotton-bureau:before { content: la-content($la-cotton-bureau); } -.#{$la-css-prefix}-couch:before { content: la-content($la-couch); } -.#{$la-css-prefix}-cpanel:before { content: la-content($la-cpanel); } -.#{$la-css-prefix}-creative-commons:before { content: la-content($la-creative-commons); } -.#{$la-css-prefix}-creative-commons-by:before { content: la-content($la-creative-commons-by); } -.#{$la-css-prefix}-creative-commons-nc:before { content: la-content($la-creative-commons-nc); } -.#{$la-css-prefix}-creative-commons-nc-eu:before { content: la-content($la-creative-commons-nc-eu); } -.#{$la-css-prefix}-creative-commons-nc-jp:before { content: la-content($la-creative-commons-nc-jp); } -.#{$la-css-prefix}-creative-commons-nd:before { content: la-content($la-creative-commons-nd); } -.#{$la-css-prefix}-creative-commons-pd:before { content: la-content($la-creative-commons-pd); } -.#{$la-css-prefix}-creative-commons-pd-alt:before { content: la-content($la-creative-commons-pd-alt); } -.#{$la-css-prefix}-creative-commons-remix:before { content: la-content($la-creative-commons-remix); } -.#{$la-css-prefix}-creative-commons-sa:before { content: la-content($la-creative-commons-sa); } -.#{$la-css-prefix}-creative-commons-sampling:before { content: la-content($la-creative-commons-sampling); } -.#{$la-css-prefix}-creative-commons-sampling-plus:before { content: la-content($la-creative-commons-sampling-plus); } -.#{$la-css-prefix}-creative-commons-share:before { content: la-content($la-creative-commons-share); } -.#{$la-css-prefix}-creative-commons-zero:before { content: la-content($la-creative-commons-zero); } -.#{$la-css-prefix}-credit-card:before { content: la-content($la-credit-card); } -.#{$la-css-prefix}-critical-role:before { content: la-content($la-critical-role); } -.#{$la-css-prefix}-crop:before { content: la-content($la-crop); } -.#{$la-css-prefix}-crop-alt:before { content: la-content($la-crop-alt); } -.#{$la-css-prefix}-cross:before { content: la-content($la-cross); } -.#{$la-css-prefix}-crosshairs:before { content: la-content($la-crosshairs); } -.#{$la-css-prefix}-crow:before { content: la-content($la-crow); } -.#{$la-css-prefix}-crown:before { content: la-content($la-crown); } -.#{$la-css-prefix}-crutch:before { content: la-content($la-crutch); } -.#{$la-css-prefix}-css3:before { content: la-content($la-css3); } -.#{$la-css-prefix}-css3-alt:before { content: la-content($la-css3-alt); } -.#{$la-css-prefix}-cube:before { content: la-content($la-cube); } -.#{$la-css-prefix}-cubes:before { content: la-content($la-cubes); } -.#{$la-css-prefix}-cut:before { content: la-content($la-cut); } -.#{$la-css-prefix}-cuttlefish:before { content: la-content($la-cuttlefish); } -.#{$la-css-prefix}-d-and-d:before { content: la-content($la-d-and-d); } -.#{$la-css-prefix}-d-and-d-beyond:before { content: la-content($la-d-and-d-beyond); } -.#{$la-css-prefix}-dashcube:before { content: la-content($la-dashcube); } -.#{$la-css-prefix}-database:before { content: la-content($la-database); } -.#{$la-css-prefix}-deaf:before { content: la-content($la-deaf); } -.#{$la-css-prefix}-delicious:before { content: la-content($la-delicious); } -.#{$la-css-prefix}-democrat:before { content: la-content($la-democrat); } -.#{$la-css-prefix}-deploydog:before { content: la-content($la-deploydog); } -.#{$la-css-prefix}-deskpro:before { content: la-content($la-deskpro); } -.#{$la-css-prefix}-desktop:before { content: la-content($la-desktop); } -.#{$la-css-prefix}-dev:before { content: la-content($la-dev); } -.#{$la-css-prefix}-deviantart:before { content: la-content($la-deviantart); } -.#{$la-css-prefix}-dharmachakra:before { content: la-content($la-dharmachakra); } -.#{$la-css-prefix}-dhl:before { content: la-content($la-dhl); } -.#{$la-css-prefix}-diagnoses:before { content: la-content($la-diagnoses); } -.#{$la-css-prefix}-diaspora:before { content: la-content($la-diaspora); } -.#{$la-css-prefix}-dice:before { content: la-content($la-dice); } -.#{$la-css-prefix}-dice-d20:before { content: la-content($la-dice-d20); } -.#{$la-css-prefix}-dice-d6:before { content: la-content($la-dice-d6); } -.#{$la-css-prefix}-dice-five:before { content: la-content($la-dice-five); } -.#{$la-css-prefix}-dice-four:before { content: la-content($la-dice-four); } -.#{$la-css-prefix}-dice-one:before { content: la-content($la-dice-one); } -.#{$la-css-prefix}-dice-six:before { content: la-content($la-dice-six); } -.#{$la-css-prefix}-dice-three:before { content: la-content($la-dice-three); } -.#{$la-css-prefix}-dice-two:before { content: la-content($la-dice-two); } -.#{$la-css-prefix}-digg:before { content: la-content($la-digg); } -.#{$la-css-prefix}-digital-ocean:before { content: la-content($la-digital-ocean); } -.#{$la-css-prefix}-digital-tachograph:before { content: la-content($la-digital-tachograph); } -.#{$la-css-prefix}-directions:before { content: la-content($la-directions); } -.#{$la-css-prefix}-discord:before { content: la-content($la-discord); } -.#{$la-css-prefix}-discourse:before { content: la-content($la-discourse); } -.#{$la-css-prefix}-divide:before { content: la-content($la-divide); } -.#{$la-css-prefix}-dizzy:before { content: la-content($la-dizzy); } -.#{$la-css-prefix}-dna:before { content: la-content($la-dna); } -.#{$la-css-prefix}-dochub:before { content: la-content($la-dochub); } -.#{$la-css-prefix}-docker:before { content: la-content($la-docker); } -.#{$la-css-prefix}-dog:before { content: la-content($la-dog); } -.#{$la-css-prefix}-dollar-sign:before { content: la-content($la-dollar-sign); } -.#{$la-css-prefix}-dolly:before { content: la-content($la-dolly); } -.#{$la-css-prefix}-dolly-flatbed:before { content: la-content($la-dolly-flatbed); } -.#{$la-css-prefix}-donate:before { content: la-content($la-donate); } -.#{$la-css-prefix}-door-closed:before { content: la-content($la-door-closed); } -.#{$la-css-prefix}-door-open:before { content: la-content($la-door-open); } -.#{$la-css-prefix}-dot-circle:before { content: la-content($la-dot-circle); } -.#{$la-css-prefix}-dove:before { content: la-content($la-dove); } -.#{$la-css-prefix}-download:before { content: la-content($la-download); } -.#{$la-css-prefix}-draft2digital:before { content: la-content($la-draft2digital); } -.#{$la-css-prefix}-drafting-compass:before { content: la-content($la-drafting-compass); } -.#{$la-css-prefix}-dragon:before { content: la-content($la-dragon); } -.#{$la-css-prefix}-draw-polygon:before { content: la-content($la-draw-polygon); } -.#{$la-css-prefix}-dribbble:before { content: la-content($la-dribbble); } -.#{$la-css-prefix}-dribbble-square:before { content: la-content($la-dribbble-square); } -.#{$la-css-prefix}-dropbox:before { content: la-content($la-dropbox); } -.#{$la-css-prefix}-drum:before { content: la-content($la-drum); } -.#{$la-css-prefix}-drum-steelpan:before { content: la-content($la-drum-steelpan); } -.#{$la-css-prefix}-drumstick-bite:before { content: la-content($la-drumstick-bite); } -.#{$la-css-prefix}-drupal:before { content: la-content($la-drupal); } -.#{$la-css-prefix}-dumbbell:before { content: la-content($la-dumbbell); } -.#{$la-css-prefix}-dumpster:before { content: la-content($la-dumpster); } -.#{$la-css-prefix}-dumpster-fire:before { content: la-content($la-dumpster-fire); } -.#{$la-css-prefix}-dungeon:before { content: la-content($la-dungeon); } -.#{$la-css-prefix}-dyalog:before { content: la-content($la-dyalog); } -.#{$la-css-prefix}-earlybirds:before { content: la-content($la-earlybirds); } -.#{$la-css-prefix}-ebay:before { content: la-content($la-ebay); } -.#{$la-css-prefix}-edge:before { content: la-content($la-edge); } -.#{$la-css-prefix}-edit:before { content: la-content($la-edit); } -.#{$la-css-prefix}-egg:before { content: la-content($la-egg); } -.#{$la-css-prefix}-eject:before { content: la-content($la-eject); } -.#{$la-css-prefix}-elementor:before { content: la-content($la-elementor); } -.#{$la-css-prefix}-ellipsis-h:before { content: la-content($la-ellipsis-h); } -.#{$la-css-prefix}-ellipsis-v:before { content: la-content($la-ellipsis-v); } -.#{$la-css-prefix}-ello:before { content: la-content($la-ello); } -.#{$la-css-prefix}-ember:before { content: la-content($la-ember); } -.#{$la-css-prefix}-empire:before { content: la-content($la-empire); } -.#{$la-css-prefix}-envelope:before { content: la-content($la-envelope); } -.#{$la-css-prefix}-envelope-open:before { content: la-content($la-envelope-open); } -.#{$la-css-prefix}-envelope-open-text:before { content: la-content($la-envelope-open-text); } -.#{$la-css-prefix}-envelope-square:before { content: la-content($la-envelope-square); } -.#{$la-css-prefix}-envira:before { content: la-content($la-envira); } -.#{$la-css-prefix}-equals:before { content: la-content($la-equals); } -.#{$la-css-prefix}-eraser:before { content: la-content($la-eraser); } -.#{$la-css-prefix}-erlang:before { content: la-content($la-erlang); } -.#{$la-css-prefix}-ethereum:before { content: la-content($la-ethereum); } -.#{$la-css-prefix}-ethernet:before { content: la-content($la-ethernet); } -.#{$la-css-prefix}-etsy:before { content: la-content($la-etsy); } -.#{$la-css-prefix}-euro-sign:before { content: la-content($la-euro-sign); } -.#{$la-css-prefix}-evernote:before { content: la-content($la-evernote); } -.#{$la-css-prefix}-exchange-alt:before { content: la-content($la-exchange-alt); } -.#{$la-css-prefix}-exclamation:before { content: la-content($la-exclamation); } -.#{$la-css-prefix}-exclamation-circle:before { content: la-content($la-exclamation-circle); } -.#{$la-css-prefix}-exclamation-triangle:before { content: la-content($la-exclamation-triangle); } -.#{$la-css-prefix}-expand:before { content: la-content($la-expand); } -.#{$la-css-prefix}-expand-arrows-alt:before { content: la-content($la-expand-arrows-alt); } -.#{$la-css-prefix}-expeditedssl:before { content: la-content($la-expeditedssl); } -.#{$la-css-prefix}-external-link-alt:before { content: la-content($la-external-link-alt); } -.#{$la-css-prefix}-external-link-square-alt:before { content: la-content($la-external-link-square-alt); } -.#{$la-css-prefix}-eye:before { content: la-content($la-eye); } -.#{$la-css-prefix}-eye-dropper:before { content: la-content($la-eye-dropper); } -.#{$la-css-prefix}-eye-slash:before { content: la-content($la-eye-slash); } -.#{$la-css-prefix}-facebook:before { content: la-content($la-facebook); } -.#{$la-css-prefix}-facebook-f:before { content: la-content($la-facebook-f); } -.#{$la-css-prefix}-facebook-messenger:before { content: la-content($la-facebook-messenger); } -.#{$la-css-prefix}-facebook-square:before { content: la-content($la-facebook-square); } -.#{$la-css-prefix}-fan:before { content: la-content($la-fan); } -.#{$la-css-prefix}-fantasy-flight-games:before { content: la-content($la-fantasy-flight-games); } -.#{$la-css-prefix}-fast-backward:before { content: la-content($la-fast-backward); } -.#{$la-css-prefix}-fast-forward:before { content: la-content($la-fast-forward); } -.#{$la-css-prefix}-fax:before { content: la-content($la-fax); } -.#{$la-css-prefix}-feather:before { content: la-content($la-feather); } -.#{$la-css-prefix}-feather-alt:before { content: la-content($la-feather-alt); } -.#{$la-css-prefix}-fedex:before { content: la-content($la-fedex); } -.#{$la-css-prefix}-fedora:before { content: la-content($la-fedora); } -.#{$la-css-prefix}-female:before { content: la-content($la-female); } -.#{$la-css-prefix}-fighter-jet:before { content: la-content($la-fighter-jet); } -.#{$la-css-prefix}-figma:before { content: la-content($la-figma); } -.#{$la-css-prefix}-file:before { content: la-content($la-file); } -.#{$la-css-prefix}-file-alt:before { content: la-content($la-file-alt); } -.#{$la-css-prefix}-file-archive:before { content: la-content($la-file-archive); } -.#{$la-css-prefix}-file-audio:before { content: la-content($la-file-audio); } -.#{$la-css-prefix}-file-code:before { content: la-content($la-file-code); } -.#{$la-css-prefix}-file-contract:before { content: la-content($la-file-contract); } -.#{$la-css-prefix}-file-csv:before { content: la-content($la-file-csv); } -.#{$la-css-prefix}-file-download:before { content: la-content($la-file-download); } -.#{$la-css-prefix}-file-excel:before { content: la-content($la-file-excel); } -.#{$la-css-prefix}-file-export:before { content: la-content($la-file-export); } -.#{$la-css-prefix}-file-image:before { content: la-content($la-file-image); } -.#{$la-css-prefix}-file-import:before { content: la-content($la-file-import); } -.#{$la-css-prefix}-file-invoice:before { content: la-content($la-file-invoice); } -.#{$la-css-prefix}-file-invoice-dollar:before { content: la-content($la-file-invoice-dollar); } -.#{$la-css-prefix}-file-medical:before { content: la-content($la-file-medical); } -.#{$la-css-prefix}-file-medical-alt:before { content: la-content($la-file-medical-alt); } -.#{$la-css-prefix}-file-pdf:before { content: la-content($la-file-pdf); } -.#{$la-css-prefix}-file-powerpoint:before { content: la-content($la-file-powerpoint); } -.#{$la-css-prefix}-file-prescription:before { content: la-content($la-file-prescription); } -.#{$la-css-prefix}-file-signature:before { content: la-content($la-file-signature); } -.#{$la-css-prefix}-file-upload:before { content: la-content($la-file-upload); } -.#{$la-css-prefix}-file-video:before { content: la-content($la-file-video); } -.#{$la-css-prefix}-file-word:before { content: la-content($la-file-word); } -.#{$la-css-prefix}-fill:before { content: la-content($la-fill); } -.#{$la-css-prefix}-fill-drip:before { content: la-content($la-fill-drip); } -.#{$la-css-prefix}-film:before { content: la-content($la-film); } -.#{$la-css-prefix}-filter:before { content: la-content($la-filter); } -.#{$la-css-prefix}-fingerprint:before { content: la-content($la-fingerprint); } -.#{$la-css-prefix}-fire:before { content: la-content($la-fire); } -.#{$la-css-prefix}-fire-alt:before { content: la-content($la-fire-alt); } -.#{$la-css-prefix}-fire-extinguisher:before { content: la-content($la-fire-extinguisher); } -.#{$la-css-prefix}-firefox:before { content: la-content($la-firefox); } -.#{$la-css-prefix}-first-aid:before { content: la-content($la-first-aid); } -.#{$la-css-prefix}-first-order:before { content: la-content($la-first-order); } -.#{$la-css-prefix}-first-order-alt:before { content: la-content($la-first-order-alt); } -.#{$la-css-prefix}-firstdraft:before { content: la-content($la-firstdraft); } -.#{$la-css-prefix}-fish:before { content: la-content($la-fish); } -.#{$la-css-prefix}-fist-raised:before { content: la-content($la-fist-raised); } -.#{$la-css-prefix}-flag:before { content: la-content($la-flag); } -.#{$la-css-prefix}-flag-checkered:before { content: la-content($la-flag-checkered); } -.#{$la-css-prefix}-flag-usa:before { content: la-content($la-flag-usa); } -.#{$la-css-prefix}-flask:before { content: la-content($la-flask); } -.#{$la-css-prefix}-flickr:before { content: la-content($la-flickr); } -.#{$la-css-prefix}-flipboard:before { content: la-content($la-flipboard); } -.#{$la-css-prefix}-flushed:before { content: la-content($la-flushed); } -.#{$la-css-prefix}-fly:before { content: la-content($la-fly); } -.#{$la-css-prefix}-folder:before { content: la-content($la-folder); } -.#{$la-css-prefix}-folder-minus:before { content: la-content($la-folder-minus); } -.#{$la-css-prefix}-folder-open:before { content: la-content($la-folder-open); } -.#{$la-css-prefix}-folder-plus:before { content: la-content($la-folder-plus); } -.#{$la-css-prefix}-font:before { content: la-content($la-font); } -.#{$la-css-prefix}-font-awesome:before { content: la-content($la-font-awesome); } -.#{$la-css-prefix}-font-awesome-alt:before { content: la-content($la-font-awesome-alt); } -.#{$la-css-prefix}-font-awesome-flag:before { content: la-content($la-font-awesome-flag); } -.#{$la-css-prefix}-fonticons:before { content: la-content($la-fonticons); } -.#{$la-css-prefix}-fonticons-fi:before { content: la-content($la-fonticons-fi); } -.#{$la-css-prefix}-football-ball:before { content: la-content($la-football-ball); } -.#{$la-css-prefix}-fort-awesome:before { content: la-content($la-fort-awesome); } -.#{$la-css-prefix}-fort-awesome-alt:before { content: la-content($la-fort-awesome-alt); } -.#{$la-css-prefix}-forumbee:before { content: la-content($la-forumbee); } -.#{$la-css-prefix}-forward:before { content: la-content($la-forward); } -.#{$la-css-prefix}-foursquare:before { content: la-content($la-foursquare); } -.#{$la-css-prefix}-free-code-camp:before { content: la-content($la-free-code-camp); } -.#{$la-css-prefix}-freebsd:before { content: la-content($la-freebsd); } -.#{$la-css-prefix}-frog:before { content: la-content($la-frog); } -.#{$la-css-prefix}-frown:before { content: la-content($la-frown); } -.#{$la-css-prefix}-frown-open:before { content: la-content($la-frown-open); } -.#{$la-css-prefix}-fulcrum:before { content: la-content($la-fulcrum); } -.#{$la-css-prefix}-funnel-dollar:before { content: la-content($la-funnel-dollar); } -.#{$la-css-prefix}-futbol:before { content: la-content($la-futbol); } -.#{$la-css-prefix}-galactic-republic:before { content: la-content($la-galactic-republic); } -.#{$la-css-prefix}-galactic-senate:before { content: la-content($la-galactic-senate); } -.#{$la-css-prefix}-gamepad:before { content: la-content($la-gamepad); } -.#{$la-css-prefix}-gas-pump:before { content: la-content($la-gas-pump); } -.#{$la-css-prefix}-gavel:before { content: la-content($la-gavel); } -.#{$la-css-prefix}-gem:before { content: la-content($la-gem); } -.#{$la-css-prefix}-genderless:before { content: la-content($la-genderless); } -.#{$la-css-prefix}-get-pocket:before { content: la-content($la-get-pocket); } -.#{$la-css-prefix}-gg:before { content: la-content($la-gg); } -.#{$la-css-prefix}-gg-circle:before { content: la-content($la-gg-circle); } -.#{$la-css-prefix}-ghost:before { content: la-content($la-ghost); } -.#{$la-css-prefix}-gift:before { content: la-content($la-gift); } -.#{$la-css-prefix}-gifts:before { content: la-content($la-gifts); } -.#{$la-css-prefix}-git:before { content: la-content($la-git); } -.#{$la-css-prefix}-git-alt:before { content: la-content($la-git-alt); } -.#{$la-css-prefix}-git-square:before { content: la-content($la-git-square); } -.#{$la-css-prefix}-github:before { content: la-content($la-github); } -.#{$la-css-prefix}-github-alt:before { content: la-content($la-github-alt); } -.#{$la-css-prefix}-github-square:before { content: la-content($la-github-square); } -.#{$la-css-prefix}-gitkraken:before { content: la-content($la-gitkraken); } -.#{$la-css-prefix}-gitlab:before { content: la-content($la-gitlab); } -.#{$la-css-prefix}-gitter:before { content: la-content($la-gitter); } -.#{$la-css-prefix}-glass-cheers:before { content: la-content($la-glass-cheers); } -.#{$la-css-prefix}-glass-martini:before { content: la-content($la-glass-martini); } -.#{$la-css-prefix}-glass-martini-alt:before { content: la-content($la-glass-martini-alt); } -.#{$la-css-prefix}-glass-whiskey:before { content: la-content($la-glass-whiskey); } -.#{$la-css-prefix}-glasses:before { content: la-content($la-glasses); } -.#{$la-css-prefix}-glide:before { content: la-content($la-glide); } -.#{$la-css-prefix}-glide-g:before { content: la-content($la-glide-g); } -.#{$la-css-prefix}-globe:before { content: la-content($la-globe); } -.#{$la-css-prefix}-globe-africa:before { content: la-content($la-globe-africa); } -.#{$la-css-prefix}-globe-americas:before { content: la-content($la-globe-americas); } -.#{$la-css-prefix}-globe-asia:before { content: la-content($la-globe-asia); } -.#{$la-css-prefix}-globe-europe:before { content: la-content($la-globe-europe); } -.#{$la-css-prefix}-gofore:before { content: la-content($la-gofore); } -.#{$la-css-prefix}-golf-ball:before { content: la-content($la-golf-ball); } -.#{$la-css-prefix}-goodreads:before { content: la-content($la-goodreads); } -.#{$la-css-prefix}-goodreads-g:before { content: la-content($la-goodreads-g); } -.#{$la-css-prefix}-google:before { content: la-content($la-google); } -.#{$la-css-prefix}-google-drive:before { content: la-content($la-google-drive); } -.#{$la-css-prefix}-google-play:before { content: la-content($la-google-play); } -.#{$la-css-prefix}-google-plus:before { content: la-content($la-google-plus); } -.#{$la-css-prefix}-google-plus-g:before { content: la-content($la-google-plus-g); } -.#{$la-css-prefix}-google-plus-square:before { content: la-content($la-google-plus-square); } -.#{$la-css-prefix}-google-wallet:before { content: la-content($la-google-wallet); } -.#{$la-css-prefix}-gopuram:before { content: la-content($la-gopuram); } -.#{$la-css-prefix}-graduation-cap:before { content: la-content($la-graduation-cap); } -.#{$la-css-prefix}-gratipay:before { content: la-content($la-gratipay); } -.#{$la-css-prefix}-grav:before { content: la-content($la-grav); } -.#{$la-css-prefix}-greater-than:before { content: la-content($la-greater-than); } -.#{$la-css-prefix}-greater-than-equal:before { content: la-content($la-greater-than-equal); } -.#{$la-css-prefix}-grimace:before { content: la-content($la-grimace); } -.#{$la-css-prefix}-grin:before { content: la-content($la-grin); } -.#{$la-css-prefix}-grin-alt:before { content: la-content($la-grin-alt); } -.#{$la-css-prefix}-grin-beam:before { content: la-content($la-grin-beam); } -.#{$la-css-prefix}-grin-beam-sweat:before { content: la-content($la-grin-beam-sweat); } -.#{$la-css-prefix}-grin-hearts:before { content: la-content($la-grin-hearts); } -.#{$la-css-prefix}-grin-squint:before { content: la-content($la-grin-squint); } -.#{$la-css-prefix}-grin-squint-tears:before { content: la-content($la-grin-squint-tears); } -.#{$la-css-prefix}-grin-stars:before { content: la-content($la-grin-stars); } -.#{$la-css-prefix}-grin-tears:before { content: la-content($la-grin-tears); } -.#{$la-css-prefix}-grin-tongue:before { content: la-content($la-grin-tongue); } -.#{$la-css-prefix}-grin-tongue-squint:before { content: la-content($la-grin-tongue-squint); } -.#{$la-css-prefix}-grin-tongue-wink:before { content: la-content($la-grin-tongue-wink); } -.#{$la-css-prefix}-grin-wink:before { content: la-content($la-grin-wink); } -.#{$la-css-prefix}-grip-horizontal:before { content: la-content($la-grip-horizontal); } -.#{$la-css-prefix}-grip-lines:before { content: la-content($la-grip-lines); } -.#{$la-css-prefix}-grip-lines-vertical:before { content: la-content($la-grip-lines-vertical); } -.#{$la-css-prefix}-grip-vertical:before { content: la-content($la-grip-vertical); } -.#{$la-css-prefix}-gripfire:before { content: la-content($la-gripfire); } -.#{$la-css-prefix}-grunt:before { content: la-content($la-grunt); } -.#{$la-css-prefix}-guitar:before { content: la-content($la-guitar); } -.#{$la-css-prefix}-gulp:before { content: la-content($la-gulp); } -.#{$la-css-prefix}-h-square:before { content: la-content($la-h-square); } -.#{$la-css-prefix}-hacker-news:before { content: la-content($la-hacker-news); } -.#{$la-css-prefix}-hacker-news-square:before { content: la-content($la-hacker-news-square); } -.#{$la-css-prefix}-hackerrank:before { content: la-content($la-hackerrank); } -.#{$la-css-prefix}-hamburger:before { content: la-content($la-hamburger); } -.#{$la-css-prefix}-hammer:before { content: la-content($la-hammer); } -.#{$la-css-prefix}-hamsa:before { content: la-content($la-hamsa); } -.#{$la-css-prefix}-hand-holding:before { content: la-content($la-hand-holding); } -.#{$la-css-prefix}-hand-holding-heart:before { content: la-content($la-hand-holding-heart); } -.#{$la-css-prefix}-hand-holding-usd:before { content: la-content($la-hand-holding-usd); } -.#{$la-css-prefix}-hand-lizard:before { content: la-content($la-hand-lizard); } -.#{$la-css-prefix}-hand-middle-finger:before { content: la-content($la-hand-middle-finger); } -.#{$la-css-prefix}-hand-paper:before { content: la-content($la-hand-paper); } -.#{$la-css-prefix}-hand-peace:before { content: la-content($la-hand-peace); } -.#{$la-css-prefix}-hand-point-down:before { content: la-content($la-hand-point-down); } -.#{$la-css-prefix}-hand-point-left:before { content: la-content($la-hand-point-left); } -.#{$la-css-prefix}-hand-point-right:before { content: la-content($la-hand-point-right); } -.#{$la-css-prefix}-hand-point-up:before { content: la-content($la-hand-point-up); } -.#{$la-css-prefix}-hand-pointer:before { content: la-content($la-hand-pointer); } -.#{$la-css-prefix}-hand-rock:before { content: la-content($la-hand-rock); } -.#{$la-css-prefix}-hand-scissors:before { content: la-content($la-hand-scissors); } -.#{$la-css-prefix}-hand-spock:before { content: la-content($la-hand-spock); } -.#{$la-css-prefix}-hands:before { content: la-content($la-hands); } -.#{$la-css-prefix}-hands-helping:before { content: la-content($la-hands-helping); } -.#{$la-css-prefix}-handshake:before { content: la-content($la-handshake); } -.#{$la-css-prefix}-hanukiah:before { content: la-content($la-hanukiah); } -.#{$la-css-prefix}-hard-hat:before { content: la-content($la-hard-hat); } -.#{$la-css-prefix}-hashtag:before { content: la-content($la-hashtag); } -.#{$la-css-prefix}-hat-wizard:before { content: la-content($la-hat-wizard); } -.#{$la-css-prefix}-haykal:before { content: la-content($la-haykal); } -.#{$la-css-prefix}-hdd:before { content: la-content($la-hdd); } -.#{$la-css-prefix}-heading:before { content: la-content($la-heading); } -.#{$la-css-prefix}-headphones:before { content: la-content($la-headphones); } -.#{$la-css-prefix}-headphones-alt:before { content: la-content($la-headphones-alt); } -.#{$la-css-prefix}-headset:before { content: la-content($la-headset); } -.#{$la-css-prefix}-heart:before { content: la-content($la-heart); } -.#{$la-css-prefix}-heart-broken:before { content: la-content($la-heart-broken); } -.#{$la-css-prefix}-heartbeat:before { content: la-content($la-heartbeat); } -.#{$la-css-prefix}-helicopter:before { content: la-content($la-helicopter); } -.#{$la-css-prefix}-highlighter:before { content: la-content($la-highlighter); } -.#{$la-css-prefix}-hiking:before { content: la-content($la-hiking); } -.#{$la-css-prefix}-hippo:before { content: la-content($la-hippo); } -.#{$la-css-prefix}-hips:before { content: la-content($la-hips); } -.#{$la-css-prefix}-hire-a-helper:before { content: la-content($la-hire-a-helper); } -.#{$la-css-prefix}-history:before { content: la-content($la-history); } -.#{$la-css-prefix}-hockey-puck:before { content: la-content($la-hockey-puck); } -.#{$la-css-prefix}-holly-berry:before { content: la-content($la-holly-berry); } -.#{$la-css-prefix}-home:before { content: la-content($la-home); } -.#{$la-css-prefix}-hooli:before { content: la-content($la-hooli); } -.#{$la-css-prefix}-hornbill:before { content: la-content($la-hornbill); } -.#{$la-css-prefix}-horse:before { content: la-content($la-horse); } -.#{$la-css-prefix}-horse-head:before { content: la-content($la-horse-head); } -.#{$la-css-prefix}-hospital:before { content: la-content($la-hospital); } -.#{$la-css-prefix}-hospital-alt:before { content: la-content($la-hospital-alt); } -.#{$la-css-prefix}-hospital-symbol:before { content: la-content($la-hospital-symbol); } -.#{$la-css-prefix}-hot-tub:before { content: la-content($la-hot-tub); } -.#{$la-css-prefix}-hotdog:before { content: la-content($la-hotdog); } -.#{$la-css-prefix}-hotel:before { content: la-content($la-hotel); } -.#{$la-css-prefix}-hotjar:before { content: la-content($la-hotjar); } -.#{$la-css-prefix}-hourglass:before { content: la-content($la-hourglass); } -.#{$la-css-prefix}-hourglass-end:before { content: la-content($la-hourglass-end); } -.#{$la-css-prefix}-hourglass-half:before { content: la-content($la-hourglass-half); } -.#{$la-css-prefix}-hourglass-start:before { content: la-content($la-hourglass-start); } -.#{$la-css-prefix}-house-damage:before { content: la-content($la-house-damage); } -.#{$la-css-prefix}-houzz:before { content: la-content($la-houzz); } -.#{$la-css-prefix}-hryvnia:before { content: la-content($la-hryvnia); } -.#{$la-css-prefix}-html5:before { content: la-content($la-html5); } -.#{$la-css-prefix}-hubspot:before { content: la-content($la-hubspot); } -.#{$la-css-prefix}-i-cursor:before { content: la-content($la-i-cursor); } -.#{$la-css-prefix}-ice-cream:before { content: la-content($la-ice-cream); } -.#{$la-css-prefix}-icicles:before { content: la-content($la-icicles); } -.#{$la-css-prefix}-icons:before { content: la-content($la-icons); } -.#{$la-css-prefix}-id-badge:before { content: la-content($la-id-badge); } -.#{$la-css-prefix}-id-card:before { content: la-content($la-id-card); } -.#{$la-css-prefix}-id-card-alt:before { content: la-content($la-id-card-alt); } -.#{$la-css-prefix}-igloo:before { content: la-content($la-igloo); } -.#{$la-css-prefix}-image:before { content: la-content($la-image); } -.#{$la-css-prefix}-images:before { content: la-content($la-images); } -.#{$la-css-prefix}-imdb:before { content: la-content($la-imdb); } -.#{$la-css-prefix}-inbox:before { content: la-content($la-inbox); } -.#{$la-css-prefix}-indent:before { content: la-content($la-indent); } -.#{$la-css-prefix}-industry:before { content: la-content($la-industry); } -.#{$la-css-prefix}-infinity:before { content: la-content($la-infinity); } -.#{$la-css-prefix}-info:before { content: la-content($la-info); } -.#{$la-css-prefix}-info-circle:before { content: la-content($la-info-circle); } -.#{$la-css-prefix}-instagram:before { content: la-content($la-instagram); } -.#{$la-css-prefix}-intercom:before { content: la-content($la-intercom); } -.#{$la-css-prefix}-internet-explorer:before { content: la-content($la-internet-explorer); } -.#{$la-css-prefix}-invision:before { content: la-content($la-invision); } -.#{$la-css-prefix}-ioxhost:before { content: la-content($la-ioxhost); } -.#{$la-css-prefix}-italic:before { content: la-content($la-italic); } -.#{$la-css-prefix}-itch-io:before { content: la-content($la-itch-io); } -.#{$la-css-prefix}-itunes:before { content: la-content($la-itunes); } -.#{$la-css-prefix}-itunes-note:before { content: la-content($la-itunes-note); } -.#{$la-css-prefix}-java:before { content: la-content($la-java); } -.#{$la-css-prefix}-jedi:before { content: la-content($la-jedi); } -.#{$la-css-prefix}-jedi-order:before { content: la-content($la-jedi-order); } -.#{$la-css-prefix}-jenkins:before { content: la-content($la-jenkins); } -.#{$la-css-prefix}-jira:before { content: la-content($la-jira); } -.#{$la-css-prefix}-joget:before { content: la-content($la-joget); } -.#{$la-css-prefix}-joint:before { content: la-content($la-joint); } -.#{$la-css-prefix}-joomla:before { content: la-content($la-joomla); } -.#{$la-css-prefix}-journal-whills:before { content: la-content($la-journal-whills); } -.#{$la-css-prefix}-js:before { content: la-content($la-js); } -.#{$la-css-prefix}-js-square:before { content: la-content($la-js-square); } -.#{$la-css-prefix}-jsfiddle:before { content: la-content($la-jsfiddle); } -.#{$la-css-prefix}-kaaba:before { content: la-content($la-kaaba); } -.#{$la-css-prefix}-kaggle:before { content: la-content($la-kaggle); } -.#{$la-css-prefix}-key:before { content: la-content($la-key); } -.#{$la-css-prefix}-keybase:before { content: la-content($la-keybase); } -.#{$la-css-prefix}-keyboard:before { content: la-content($la-keyboard); } -.#{$la-css-prefix}-keycdn:before { content: la-content($la-keycdn); } -.#{$la-css-prefix}-khanda:before { content: la-content($la-khanda); } -.#{$la-css-prefix}-kickstarter:before { content: la-content($la-kickstarter); } -.#{$la-css-prefix}-kickstarter-k:before { content: la-content($la-kickstarter-k); } -.#{$la-css-prefix}-kiss:before { content: la-content($la-kiss); } -.#{$la-css-prefix}-kiss-beam:before { content: la-content($la-kiss-beam); } -.#{$la-css-prefix}-kiss-wink-heart:before { content: la-content($la-kiss-wink-heart); } -.#{$la-css-prefix}-kiwi-bird:before { content: la-content($la-kiwi-bird); } -.#{$la-css-prefix}-korvue:before { content: la-content($la-korvue); } -.#{$la-css-prefix}-landmark:before { content: la-content($la-landmark); } -.#{$la-css-prefix}-language:before { content: la-content($la-language); } -.#{$la-css-prefix}-laptop:before { content: la-content($la-laptop); } -.#{$la-css-prefix}-laptop-code:before { content: la-content($la-laptop-code); } -.#{$la-css-prefix}-laptop-medical:before { content: la-content($la-laptop-medical); } -.#{$la-css-prefix}-laravel:before { content: la-content($la-laravel); } -.#{$la-css-prefix}-lastfm:before { content: la-content($la-lastfm); } -.#{$la-css-prefix}-lastfm-square:before { content: la-content($la-lastfm-square); } -.#{$la-css-prefix}-laugh:before { content: la-content($la-laugh); } -.#{$la-css-prefix}-laugh-beam:before { content: la-content($la-laugh-beam); } -.#{$la-css-prefix}-laugh-squint:before { content: la-content($la-laugh-squint); } -.#{$la-css-prefix}-laugh-wink:before { content: la-content($la-laugh-wink); } -.#{$la-css-prefix}-layer-group:before { content: la-content($la-layer-group); } -.#{$la-css-prefix}-leaf:before { content: la-content($la-leaf); } -.#{$la-css-prefix}-leanpub:before { content: la-content($la-leanpub); } -.#{$la-css-prefix}-lemon:before { content: la-content($la-lemon); } -.#{$la-css-prefix}-less:before { content: la-content($la-less); } -.#{$la-css-prefix}-less-than:before { content: la-content($la-less-than); } -.#{$la-css-prefix}-less-than-equal:before { content: la-content($la-less-than-equal); } -.#{$la-css-prefix}-level-down-alt:before { content: la-content($la-level-down-alt); } -.#{$la-css-prefix}-level-up-alt:before { content: la-content($la-level-up-alt); } -.#{$la-css-prefix}-life-ring:before { content: la-content($la-life-ring); } -.#{$la-css-prefix}-lightbulb:before { content: la-content($la-lightbulb); } -.#{$la-css-prefix}-line:before { content: la-content($la-line); } -.#{$la-css-prefix}-link:before { content: la-content($la-link); } -.#{$la-css-prefix}-linkedin:before { content: la-content($la-linkedin); } -.#{$la-css-prefix}-linkedin-in:before { content: la-content($la-linkedin-in); } -.#{$la-css-prefix}-linode:before { content: la-content($la-linode); } -.#{$la-css-prefix}-linux:before { content: la-content($la-linux); } -.#{$la-css-prefix}-lira-sign:before { content: la-content($la-lira-sign); } -.#{$la-css-prefix}-list:before { content: la-content($la-list); } -.#{$la-css-prefix}-list-alt:before { content: la-content($la-list-alt); } -.#{$la-css-prefix}-list-ol:before { content: la-content($la-list-ol); } -.#{$la-css-prefix}-list-ul:before { content: la-content($la-list-ul); } -.#{$la-css-prefix}-location-arrow:before { content: la-content($la-location-arrow); } -.#{$la-css-prefix}-lock:before { content: la-content($la-lock); } -.#{$la-css-prefix}-lock-open:before { content: la-content($la-lock-open); } -.#{$la-css-prefix}-long-arrow-alt-down:before { content: la-content($la-long-arrow-alt-down); } -.#{$la-css-prefix}-long-arrow-alt-left:before { content: la-content($la-long-arrow-alt-left); } -.#{$la-css-prefix}-long-arrow-alt-right:before { content: la-content($la-long-arrow-alt-right); } -.#{$la-css-prefix}-long-arrow-alt-up:before { content: la-content($la-long-arrow-alt-up); } -.#{$la-css-prefix}-low-vision:before { content: la-content($la-low-vision); } -.#{$la-css-prefix}-luggage-cart:before { content: la-content($la-luggage-cart); } -.#{$la-css-prefix}-lyft:before { content: la-content($la-lyft); } -.#{$la-css-prefix}-magento:before { content: la-content($la-magento); } -.#{$la-css-prefix}-magic:before { content: la-content($la-magic); } -.#{$la-css-prefix}-magnet:before { content: la-content($la-magnet); } -.#{$la-css-prefix}-mail-bulk:before { content: la-content($la-mail-bulk); } -.#{$la-css-prefix}-mailchimp:before { content: la-content($la-mailchimp); } -.#{$la-css-prefix}-male:before { content: la-content($la-male); } -.#{$la-css-prefix}-mandalorian:before { content: la-content($la-mandalorian); } -.#{$la-css-prefix}-map:before { content: la-content($la-map); } -.#{$la-css-prefix}-map-marked:before { content: la-content($la-map-marked); } -.#{$la-css-prefix}-map-marked-alt:before { content: la-content($la-map-marked-alt); } -.#{$la-css-prefix}-map-marker:before { content: la-content($la-map-marker); } -.#{$la-css-prefix}-map-marker-alt:before { content: la-content($la-map-marker-alt); } -.#{$la-css-prefix}-map-pin:before { content: la-content($la-map-pin); } -.#{$la-css-prefix}-map-signs:before { content: la-content($la-map-signs); } -.#{$la-css-prefix}-markdown:before { content: la-content($la-markdown); } -.#{$la-css-prefix}-marker:before { content: la-content($la-marker); } -.#{$la-css-prefix}-mars:before { content: la-content($la-mars); } -.#{$la-css-prefix}-mars-double:before { content: la-content($la-mars-double); } -.#{$la-css-prefix}-mars-stroke:before { content: la-content($la-mars-stroke); } -.#{$la-css-prefix}-mars-stroke-h:before { content: la-content($la-mars-stroke-h); } -.#{$la-css-prefix}-mars-stroke-v:before { content: la-content($la-mars-stroke-v); } -.#{$la-css-prefix}-mask:before { content: la-content($la-mask); } -.#{$la-css-prefix}-mastodon:before { content: la-content($la-mastodon); } -.#{$la-css-prefix}-maxcdn:before { content: la-content($la-maxcdn); } -.#{$la-css-prefix}-medal:before { content: la-content($la-medal); } -.#{$la-css-prefix}-medapps:before { content: la-content($la-medapps); } -.#{$la-css-prefix}-medium:before { content: la-content($la-medium); } -.#{$la-css-prefix}-medium-m:before { content: la-content($la-medium-m); } -.#{$la-css-prefix}-medkit:before { content: la-content($la-medkit); } -.#{$la-css-prefix}-medrt:before { content: la-content($la-medrt); } -.#{$la-css-prefix}-meetup:before { content: la-content($la-meetup); } -.#{$la-css-prefix}-megaport:before { content: la-content($la-megaport); } -.#{$la-css-prefix}-meh:before { content: la-content($la-meh); } -.#{$la-css-prefix}-meh-blank:before { content: la-content($la-meh-blank); } -.#{$la-css-prefix}-meh-rolling-eyes:before { content: la-content($la-meh-rolling-eyes); } -.#{$la-css-prefix}-memory:before { content: la-content($la-memory); } -.#{$la-css-prefix}-mendeley:before { content: la-content($la-mendeley); } -.#{$la-css-prefix}-menorah:before { content: la-content($la-menorah); } -.#{$la-css-prefix}-mercury:before { content: la-content($la-mercury); } -.#{$la-css-prefix}-meteor:before { content: la-content($la-meteor); } -.#{$la-css-prefix}-microchip:before { content: la-content($la-microchip); } -.#{$la-css-prefix}-microphone:before { content: la-content($la-microphone); } -.#{$la-css-prefix}-microphone-alt:before { content: la-content($la-microphone-alt); } -.#{$la-css-prefix}-microphone-alt-slash:before { content: la-content($la-microphone-alt-slash); } -.#{$la-css-prefix}-microphone-slash:before { content: la-content($la-microphone-slash); } -.#{$la-css-prefix}-microscope:before { content: la-content($la-microscope); } -.#{$la-css-prefix}-microsoft:before { content: la-content($la-microsoft); } -.#{$la-css-prefix}-minus:before { content: la-content($la-minus); } -.#{$la-css-prefix}-minus-circle:before { content: la-content($la-minus-circle); } -.#{$la-css-prefix}-minus-square:before { content: la-content($la-minus-square); } -.#{$la-css-prefix}-mitten:before { content: la-content($la-mitten); } -.#{$la-css-prefix}-mix:before { content: la-content($la-mix); } -.#{$la-css-prefix}-mixcloud:before { content: la-content($la-mixcloud); } -.#{$la-css-prefix}-mizuni:before { content: la-content($la-mizuni); } -.#{$la-css-prefix}-mobile:before { content: la-content($la-mobile); } -.#{$la-css-prefix}-mobile-alt:before { content: la-content($la-mobile-alt); } -.#{$la-css-prefix}-modx:before { content: la-content($la-modx); } -.#{$la-css-prefix}-monero:before { content: la-content($la-monero); } -.#{$la-css-prefix}-money-bill:before { content: la-content($la-money-bill); } -.#{$la-css-prefix}-money-bill-alt:before { content: la-content($la-money-bill-alt); } -.#{$la-css-prefix}-money-bill-wave:before { content: la-content($la-money-bill-wave); } -.#{$la-css-prefix}-money-bill-wave-alt:before { content: la-content($la-money-bill-wave-alt); } -.#{$la-css-prefix}-money-check:before { content: la-content($la-money-check); } -.#{$la-css-prefix}-money-check-alt:before { content: la-content($la-money-check-alt); } -.#{$la-css-prefix}-monument:before { content: la-content($la-monument); } -.#{$la-css-prefix}-moon:before { content: la-content($la-moon); } -.#{$la-css-prefix}-mortar-pestle:before { content: la-content($la-mortar-pestle); } -.#{$la-css-prefix}-mosque:before { content: la-content($la-mosque); } -.#{$la-css-prefix}-motorcycle:before { content: la-content($la-motorcycle); } -.#{$la-css-prefix}-mountain:before { content: la-content($la-mountain); } -.#{$la-css-prefix}-mouse-pointer:before { content: la-content($la-mouse-pointer); } -.#{$la-css-prefix}-mug-hot:before { content: la-content($la-mug-hot); } -.#{$la-css-prefix}-music:before { content: la-content($la-music); } -.#{$la-css-prefix}-napster:before { content: la-content($la-napster); } -.#{$la-css-prefix}-neos:before { content: la-content($la-neos); } -.#{$la-css-prefix}-network-wired:before { content: la-content($la-network-wired); } -.#{$la-css-prefix}-neuter:before { content: la-content($la-neuter); } -.#{$la-css-prefix}-newspaper:before { content: la-content($la-newspaper); } -.#{$la-css-prefix}-nimblr:before { content: la-content($la-nimblr); } -.#{$la-css-prefix}-node:before { content: la-content($la-node); } -.#{$la-css-prefix}-node-js:before { content: la-content($la-node-js); } -.#{$la-css-prefix}-not-equal:before { content: la-content($la-not-equal); } -.#{$la-css-prefix}-notes-medical:before { content: la-content($la-notes-medical); } -.#{$la-css-prefix}-npm:before { content: la-content($la-npm); } -.#{$la-css-prefix}-ns8:before { content: la-content($la-ns8); } -.#{$la-css-prefix}-nutritionix:before { content: la-content($la-nutritionix); } -.#{$la-css-prefix}-object-group:before { content: la-content($la-object-group); } -.#{$la-css-prefix}-object-ungroup:before { content: la-content($la-object-ungroup); } -.#{$la-css-prefix}-odnoklassniki:before { content: la-content($la-odnoklassniki); } -.#{$la-css-prefix}-odnoklassniki-square:before { content: la-content($la-odnoklassniki-square); } -.#{$la-css-prefix}-oil-can:before { content: la-content($la-oil-can); } -.#{$la-css-prefix}-old-republic:before { content: la-content($la-old-republic); } -.#{$la-css-prefix}-om:before { content: la-content($la-om); } -.#{$la-css-prefix}-opencart:before { content: la-content($la-opencart); } -.#{$la-css-prefix}-openid:before { content: la-content($la-openid); } -.#{$la-css-prefix}-opera:before { content: la-content($la-opera); } -.#{$la-css-prefix}-optin-monster:before { content: la-content($la-optin-monster); } -.#{$la-css-prefix}-osi:before { content: la-content($la-osi); } -.#{$la-css-prefix}-otter:before { content: la-content($la-otter); } -.#{$la-css-prefix}-outdent:before { content: la-content($la-outdent); } -.#{$la-css-prefix}-page4:before { content: la-content($la-page4); } -.#{$la-css-prefix}-pagelines:before { content: la-content($la-pagelines); } -.#{$la-css-prefix}-pager:before { content: la-content($la-pager); } -.#{$la-css-prefix}-paint-brush:before { content: la-content($la-paint-brush); } -.#{$la-css-prefix}-paint-roller:before { content: la-content($la-paint-roller); } -.#{$la-css-prefix}-palette:before { content: la-content($la-palette); } -.#{$la-css-prefix}-palfed:before { content: la-content($la-palfed); } -.#{$la-css-prefix}-pallet:before { content: la-content($la-pallet); } -.#{$la-css-prefix}-paper-plane:before { content: la-content($la-paper-plane); } -.#{$la-css-prefix}-paperclip:before { content: la-content($la-paperclip); } -.#{$la-css-prefix}-parachute-box:before { content: la-content($la-parachute-box); } -.#{$la-css-prefix}-paragraph:before { content: la-content($la-paragraph); } -.#{$la-css-prefix}-parking:before { content: la-content($la-parking); } -.#{$la-css-prefix}-passport:before { content: la-content($la-passport); } -.#{$la-css-prefix}-pastafarianism:before { content: la-content($la-pastafarianism); } -.#{$la-css-prefix}-paste:before { content: la-content($la-paste); } -.#{$la-css-prefix}-patreon:before { content: la-content($la-patreon); } -.#{$la-css-prefix}-pause:before { content: la-content($la-pause); } -.#{$la-css-prefix}-pause-circle:before { content: la-content($la-pause-circle); } -.#{$la-css-prefix}-paw:before { content: la-content($la-paw); } -.#{$la-css-prefix}-paypal:before { content: la-content($la-paypal); } -.#{$la-css-prefix}-peace:before { content: la-content($la-peace); } -.#{$la-css-prefix}-pen:before { content: la-content($la-pen); } -.#{$la-css-prefix}-pen-alt:before { content: la-content($la-pen-alt); } -.#{$la-css-prefix}-pen-fancy:before { content: la-content($la-pen-fancy); } -.#{$la-css-prefix}-pen-nib:before { content: la-content($la-pen-nib); } -.#{$la-css-prefix}-pen-square:before { content: la-content($la-pen-square); } -.#{$la-css-prefix}-pencil-alt:before { content: la-content($la-pencil-alt); } -.#{$la-css-prefix}-pencil-ruler:before { content: la-content($la-pencil-ruler); } -.#{$la-css-prefix}-penny-arcade:before { content: la-content($la-penny-arcade); } -.#{$la-css-prefix}-people-carry:before { content: la-content($la-people-carry); } -.#{$la-css-prefix}-pepper-hot:before { content: la-content($la-pepper-hot); } -.#{$la-css-prefix}-percent:before { content: la-content($la-percent); } -.#{$la-css-prefix}-percentage:before { content: la-content($la-percentage); } -.#{$la-css-prefix}-periscope:before { content: la-content($la-periscope); } -.#{$la-css-prefix}-person-booth:before { content: la-content($la-person-booth); } -.#{$la-css-prefix}-phabricator:before { content: la-content($la-phabricator); } -.#{$la-css-prefix}-phoenix-framework:before { content: la-content($la-phoenix-framework); } -.#{$la-css-prefix}-phoenix-squadron:before { content: la-content($la-phoenix-squadron); } -.#{$la-css-prefix}-phone:before { content: la-content($la-phone); } -.#{$la-css-prefix}-phone-alt:before { content: la-content($la-phone-alt); } -.#{$la-css-prefix}-phone-slash:before { content: la-content($la-phone-slash); } -.#{$la-css-prefix}-phone-square:before { content: la-content($la-phone-square); } -.#{$la-css-prefix}-phone-square-alt:before { content: la-content($la-phone-square-alt); } -.#{$la-css-prefix}-phone-volume:before { content: la-content($la-phone-volume); } -.#{$la-css-prefix}-photo-video:before { content: la-content($la-photo-video); } -.#{$la-css-prefix}-php:before { content: la-content($la-php); } -.#{$la-css-prefix}-pied-piper:before { content: la-content($la-pied-piper); } -.#{$la-css-prefix}-pied-piper-alt:before { content: la-content($la-pied-piper-alt); } -.#{$la-css-prefix}-pied-piper-hat:before { content: la-content($la-pied-piper-hat); } -.#{$la-css-prefix}-pied-piper-pp:before { content: la-content($la-pied-piper-pp); } -.#{$la-css-prefix}-piggy-bank:before { content: la-content($la-piggy-bank); } -.#{$la-css-prefix}-pills:before { content: la-content($la-pills); } -.#{$la-css-prefix}-pinterest:before { content: la-content($la-pinterest); } -.#{$la-css-prefix}-pinterest-p:before { content: la-content($la-pinterest-p); } -.#{$la-css-prefix}-pinterest-square:before { content: la-content($la-pinterest-square); } -.#{$la-css-prefix}-pizza-slice:before { content: la-content($la-pizza-slice); } -.#{$la-css-prefix}-place-of-worship:before { content: la-content($la-place-of-worship); } -.#{$la-css-prefix}-plane:before { content: la-content($la-plane); } -.#{$la-css-prefix}-plane-arrival:before { content: la-content($la-plane-arrival); } -.#{$la-css-prefix}-plane-departure:before { content: la-content($la-plane-departure); } -.#{$la-css-prefix}-play:before { content: la-content($la-play); } -.#{$la-css-prefix}-play-circle:before { content: la-content($la-play-circle); } -.#{$la-css-prefix}-playstation:before { content: la-content($la-playstation); } -.#{$la-css-prefix}-plug:before { content: la-content($la-plug); } -.#{$la-css-prefix}-plus:before { content: la-content($la-plus); } -.#{$la-css-prefix}-plus-circle:before { content: la-content($la-plus-circle); } -.#{$la-css-prefix}-plus-square:before { content: la-content($la-plus-square); } -.#{$la-css-prefix}-podcast:before { content: la-content($la-podcast); } -.#{$la-css-prefix}-poll:before { content: la-content($la-poll); } -.#{$la-css-prefix}-poll-h:before { content: la-content($la-poll-h); } -.#{$la-css-prefix}-poo:before { content: la-content($la-poo); } -.#{$la-css-prefix}-poo-storm:before { content: la-content($la-poo-storm); } -.#{$la-css-prefix}-poop:before { content: la-content($la-poop); } -.#{$la-css-prefix}-portrait:before { content: la-content($la-portrait); } -.#{$la-css-prefix}-pound-sign:before { content: la-content($la-pound-sign); } -.#{$la-css-prefix}-power-off:before { content: la-content($la-power-off); } -.#{$la-css-prefix}-pray:before { content: la-content($la-pray); } -.#{$la-css-prefix}-praying-hands:before { content: la-content($la-praying-hands); } -.#{$la-css-prefix}-prescription:before { content: la-content($la-prescription); } -.#{$la-css-prefix}-prescription-bottle:before { content: la-content($la-prescription-bottle); } -.#{$la-css-prefix}-prescription-bottle-alt:before { content: la-content($la-prescription-bottle-alt); } -.#{$la-css-prefix}-print:before { content: la-content($la-print); } -.#{$la-css-prefix}-procedures:before { content: la-content($la-procedures); } -.#{$la-css-prefix}-product-hunt:before { content: la-content($la-product-hunt); } -.#{$la-css-prefix}-project-diagram:before { content: la-content($la-project-diagram); } -.#{$la-css-prefix}-pushed:before { content: la-content($la-pushed); } -.#{$la-css-prefix}-puzzle-piece:before { content: la-content($la-puzzle-piece); } -.#{$la-css-prefix}-python:before { content: la-content($la-python); } -.#{$la-css-prefix}-qq:before { content: la-content($la-qq); } -.#{$la-css-prefix}-qrcode:before { content: la-content($la-qrcode); } -.#{$la-css-prefix}-question:before { content: la-content($la-question); } -.#{$la-css-prefix}-question-circle:before { content: la-content($la-question-circle); } -.#{$la-css-prefix}-quidditch:before { content: la-content($la-quidditch); } -.#{$la-css-prefix}-quinscape:before { content: la-content($la-quinscape); } -.#{$la-css-prefix}-quora:before { content: la-content($la-quora); } -.#{$la-css-prefix}-quote-left:before { content: la-content($la-quote-left); } -.#{$la-css-prefix}-quote-right:before { content: la-content($la-quote-right); } -.#{$la-css-prefix}-quran:before { content: la-content($la-quran); } -.#{$la-css-prefix}-r-project:before { content: la-content($la-r-project); } -.#{$la-css-prefix}-radiation:before { content: la-content($la-radiation); } -.#{$la-css-prefix}-radiation-alt:before { content: la-content($la-radiation-alt); } -.#{$la-css-prefix}-rainbow:before { content: la-content($la-rainbow); } -.#{$la-css-prefix}-random:before { content: la-content($la-random); } -.#{$la-css-prefix}-raspberry-pi:before { content: la-content($la-raspberry-pi); } -.#{$la-css-prefix}-ravelry:before { content: la-content($la-ravelry); } -.#{$la-css-prefix}-react:before { content: la-content($la-react); } -.#{$la-css-prefix}-reacteurope:before { content: la-content($la-reacteurope); } -.#{$la-css-prefix}-readme:before { content: la-content($la-readme); } -.#{$la-css-prefix}-rebel:before { content: la-content($la-rebel); } -.#{$la-css-prefix}-receipt:before { content: la-content($la-receipt); } -.#{$la-css-prefix}-recycle:before { content: la-content($la-recycle); } -.#{$la-css-prefix}-red-river:before { content: la-content($la-red-river); } -.#{$la-css-prefix}-reddit:before { content: la-content($la-reddit); } -.#{$la-css-prefix}-reddit-alien:before { content: la-content($la-reddit-alien); } -.#{$la-css-prefix}-reddit-square:before { content: la-content($la-reddit-square); } -.#{$la-css-prefix}-redhat:before { content: la-content($la-redhat); } -.#{$la-css-prefix}-redo:before { content: la-content($la-redo); } -.#{$la-css-prefix}-redo-alt:before { content: la-content($la-redo-alt); } -.#{$la-css-prefix}-registered:before { content: la-content($la-registered); } -.#{$la-css-prefix}-remove-format:before { content: la-content($la-remove-format); } -.#{$la-css-prefix}-renren:before { content: la-content($la-renren); } -.#{$la-css-prefix}-reply:before { content: la-content($la-reply); } -.#{$la-css-prefix}-reply-all:before { content: la-content($la-reply-all); } -.#{$la-css-prefix}-replyd:before { content: la-content($la-replyd); } -.#{$la-css-prefix}-republican:before { content: la-content($la-republican); } -.#{$la-css-prefix}-researchgate:before { content: la-content($la-researchgate); } -.#{$la-css-prefix}-resolving:before { content: la-content($la-resolving); } -.#{$la-css-prefix}-restroom:before { content: la-content($la-restroom); } -.#{$la-css-prefix}-retweet:before { content: la-content($la-retweet); } -.#{$la-css-prefix}-rev:before { content: la-content($la-rev); } -.#{$la-css-prefix}-ribbon:before { content: la-content($la-ribbon); } -.#{$la-css-prefix}-ring:before { content: la-content($la-ring); } -.#{$la-css-prefix}-road:before { content: la-content($la-road); } -.#{$la-css-prefix}-robot:before { content: la-content($la-robot); } -.#{$la-css-prefix}-rocket:before { content: la-content($la-rocket); } -.#{$la-css-prefix}-rocketchat:before { content: la-content($la-rocketchat); } -.#{$la-css-prefix}-rockrms:before { content: la-content($la-rockrms); } -.#{$la-css-prefix}-route:before { content: la-content($la-route); } -.#{$la-css-prefix}-rss:before { content: la-content($la-rss); } -.#{$la-css-prefix}-rss-square:before { content: la-content($la-rss-square); } -.#{$la-css-prefix}-ruble-sign:before { content: la-content($la-ruble-sign); } -.#{$la-css-prefix}-ruler:before { content: la-content($la-ruler); } -.#{$la-css-prefix}-ruler-combined:before { content: la-content($la-ruler-combined); } -.#{$la-css-prefix}-ruler-horizontal:before { content: la-content($la-ruler-horizontal); } -.#{$la-css-prefix}-ruler-vertical:before { content: la-content($la-ruler-vertical); } -.#{$la-css-prefix}-running:before { content: la-content($la-running); } -.#{$la-css-prefix}-rupee-sign:before { content: la-content($la-rupee-sign); } -.#{$la-css-prefix}-sad-cry:before { content: la-content($la-sad-cry); } -.#{$la-css-prefix}-sad-tear:before { content: la-content($la-sad-tear); } -.#{$la-css-prefix}-safari:before { content: la-content($la-safari); } -.#{$la-css-prefix}-salesforce:before { content: la-content($la-salesforce); } -.#{$la-css-prefix}-sass:before { content: la-content($la-sass); } -.#{$la-css-prefix}-satellite:before { content: la-content($la-satellite); } -.#{$la-css-prefix}-satellite-dish:before { content: la-content($la-satellite-dish); } -.#{$la-css-prefix}-save:before { content: la-content($la-save); } -.#{$la-css-prefix}-schlix:before { content: la-content($la-schlix); } -.#{$la-css-prefix}-school:before { content: la-content($la-school); } -.#{$la-css-prefix}-screwdriver:before { content: la-content($la-screwdriver); } -.#{$la-css-prefix}-scribd:before { content: la-content($la-scribd); } -.#{$la-css-prefix}-scroll:before { content: la-content($la-scroll); } -.#{$la-css-prefix}-sd-card:before { content: la-content($la-sd-card); } -.#{$la-css-prefix}-search:before { content: la-content($la-search); } -.#{$la-css-prefix}-search-dollar:before { content: la-content($la-search-dollar); } -.#{$la-css-prefix}-search-location:before { content: la-content($la-search-location); } -.#{$la-css-prefix}-search-minus:before { content: la-content($la-search-minus); } -.#{$la-css-prefix}-search-plus:before { content: la-content($la-search-plus); } -.#{$la-css-prefix}-searchengin:before { content: la-content($la-searchengin); } -.#{$la-css-prefix}-seedling:before { content: la-content($la-seedling); } -.#{$la-css-prefix}-sellcast:before { content: la-content($la-sellcast); } -.#{$la-css-prefix}-sellsy:before { content: la-content($la-sellsy); } -.#{$la-css-prefix}-server:before { content: la-content($la-server); } -.#{$la-css-prefix}-servicestack:before { content: la-content($la-servicestack); } -.#{$la-css-prefix}-shapes:before { content: la-content($la-shapes); } -.#{$la-css-prefix}-share:before { content: la-content($la-share); } -.#{$la-css-prefix}-share-alt:before { content: la-content($la-share-alt); } -.#{$la-css-prefix}-share-alt-square:before { content: la-content($la-share-alt-square); } -.#{$la-css-prefix}-share-square:before { content: la-content($la-share-square); } -.#{$la-css-prefix}-shekel-sign:before { content: la-content($la-shekel-sign); } -.#{$la-css-prefix}-shield-alt:before { content: la-content($la-shield-alt); } -.#{$la-css-prefix}-ship:before { content: la-content($la-ship); } -.#{$la-css-prefix}-shipping-fast:before { content: la-content($la-shipping-fast); } -.#{$la-css-prefix}-shirtsinbulk:before { content: la-content($la-shirtsinbulk); } -.#{$la-css-prefix}-shoe-prints:before { content: la-content($la-shoe-prints); } -.#{$la-css-prefix}-shopping-bag:before { content: la-content($la-shopping-bag); } -.#{$la-css-prefix}-shopping-basket:before { content: la-content($la-shopping-basket); } -.#{$la-css-prefix}-shopping-cart:before { content: la-content($la-shopping-cart); } -.#{$la-css-prefix}-shopware:before { content: la-content($la-shopware); } -.#{$la-css-prefix}-shower:before { content: la-content($la-shower); } -.#{$la-css-prefix}-shuttle-van:before { content: la-content($la-shuttle-van); } -.#{$la-css-prefix}-sign:before { content: la-content($la-sign); } -.#{$la-css-prefix}-sign-in-alt:before { content: la-content($la-sign-in-alt); } -.#{$la-css-prefix}-sign-language:before { content: la-content($la-sign-language); } -.#{$la-css-prefix}-sign-out-alt:before { content: la-content($la-sign-out-alt); } -.#{$la-css-prefix}-signal:before { content: la-content($la-signal); } -.#{$la-css-prefix}-signature:before { content: la-content($la-signature); } -.#{$la-css-prefix}-sim-card:before { content: la-content($la-sim-card); } -.#{$la-css-prefix}-simplybuilt:before { content: la-content($la-simplybuilt); } -.#{$la-css-prefix}-sistrix:before { content: la-content($la-sistrix); } -.#{$la-css-prefix}-sitemap:before { content: la-content($la-sitemap); } -.#{$la-css-prefix}-sith:before { content: la-content($la-sith); } -.#{$la-css-prefix}-skating:before { content: la-content($la-skating); } -.#{$la-css-prefix}-sketch:before { content: la-content($la-sketch); } -.#{$la-css-prefix}-skiing:before { content: la-content($la-skiing); } -.#{$la-css-prefix}-skiing-nordic:before { content: la-content($la-skiing-nordic); } -.#{$la-css-prefix}-skull:before { content: la-content($la-skull); } -.#{$la-css-prefix}-skull-crossbones:before { content: la-content($la-skull-crossbones); } -.#{$la-css-prefix}-skyatlas:before { content: la-content($la-skyatlas); } -.#{$la-css-prefix}-skype:before { content: la-content($la-skype); } -.#{$la-css-prefix}-slack:before { content: la-content($la-slack); } -.#{$la-css-prefix}-slack-hash:before { content: la-content($la-slack-hash); } -.#{$la-css-prefix}-slash:before { content: la-content($la-slash); } -.#{$la-css-prefix}-sleigh:before { content: la-content($la-sleigh); } -.#{$la-css-prefix}-sliders-h:before { content: la-content($la-sliders-h); } -.#{$la-css-prefix}-slideshare:before { content: la-content($la-slideshare); } -.#{$la-css-prefix}-smile:before { content: la-content($la-smile); } -.#{$la-css-prefix}-smile-beam:before { content: la-content($la-smile-beam); } -.#{$la-css-prefix}-smile-wink:before { content: la-content($la-smile-wink); } -.#{$la-css-prefix}-smog:before { content: la-content($la-smog); } -.#{$la-css-prefix}-smoking:before { content: la-content($la-smoking); } -.#{$la-css-prefix}-smoking-ban:before { content: la-content($la-smoking-ban); } -.#{$la-css-prefix}-sms:before { content: la-content($la-sms); } -.#{$la-css-prefix}-snapchat:before { content: la-content($la-snapchat); } -.#{$la-css-prefix}-snapchat-ghost:before { content: la-content($la-snapchat-ghost); } -.#{$la-css-prefix}-snapchat-square:before { content: la-content($la-snapchat-square); } -.#{$la-css-prefix}-snowboarding:before { content: la-content($la-snowboarding); } -.#{$la-css-prefix}-snowflake:before { content: la-content($la-snowflake); } -.#{$la-css-prefix}-snowman:before { content: la-content($la-snowman); } -.#{$la-css-prefix}-snowplow:before { content: la-content($la-snowplow); } -.#{$la-css-prefix}-socks:before { content: la-content($la-socks); } -.#{$la-css-prefix}-solar-panel:before { content: la-content($la-solar-panel); } -.#{$la-css-prefix}-sort:before { content: la-content($la-sort); } -.#{$la-css-prefix}-sort-alpha-down:before { content: la-content($la-sort-alpha-down); } -.#{$la-css-prefix}-sort-alpha-down-alt:before { content: la-content($la-sort-alpha-down-alt); } -.#{$la-css-prefix}-sort-alpha-up:before { content: la-content($la-sort-alpha-up); } -.#{$la-css-prefix}-sort-alpha-up-alt:before { content: la-content($la-sort-alpha-up-alt); } -.#{$la-css-prefix}-sort-amount-down:before { content: la-content($la-sort-amount-down); } -.#{$la-css-prefix}-sort-amount-down-alt:before { content: la-content($la-sort-amount-down-alt); } -.#{$la-css-prefix}-sort-amount-up:before { content: la-content($la-sort-amount-up); } -.#{$la-css-prefix}-sort-amount-up-alt:before { content: la-content($la-sort-amount-up-alt); } -.#{$la-css-prefix}-sort-down:before { content: la-content($la-sort-down); } -.#{$la-css-prefix}-sort-numeric-down:before { content: la-content($la-sort-numeric-down); } -.#{$la-css-prefix}-sort-numeric-down-alt:before { content: la-content($la-sort-numeric-down-alt); } -.#{$la-css-prefix}-sort-numeric-up:before { content: la-content($la-sort-numeric-up); } -.#{$la-css-prefix}-sort-numeric-up-alt:before { content: la-content($la-sort-numeric-up-alt); } -.#{$la-css-prefix}-sort-up:before { content: la-content($la-sort-up); } -.#{$la-css-prefix}-soundcloud:before { content: la-content($la-soundcloud); } -.#{$la-css-prefix}-sourcetree:before { content: la-content($la-sourcetree); } -.#{$la-css-prefix}-spa:before { content: la-content($la-spa); } -.#{$la-css-prefix}-space-shuttle:before { content: la-content($la-space-shuttle); } -.#{$la-css-prefix}-speakap:before { content: la-content($la-speakap); } -.#{$la-css-prefix}-speaker-deck:before { content: la-content($la-speaker-deck); } -.#{$la-css-prefix}-spell-check:before { content: la-content($la-spell-check); } -.#{$la-css-prefix}-spider:before { content: la-content($la-spider); } -.#{$la-css-prefix}-spinner:before { content: la-content($la-spinner); } -.#{$la-css-prefix}-splotch:before { content: la-content($la-splotch); } -.#{$la-css-prefix}-spotify:before { content: la-content($la-spotify); } -.#{$la-css-prefix}-spray-can:before { content: la-content($la-spray-can); } -.#{$la-css-prefix}-square:before { content: la-content($la-square); } -.#{$la-css-prefix}-square-full:before { content: la-content($la-square-full); } -.#{$la-css-prefix}-square-root-alt:before { content: la-content($la-square-root-alt); } -.#{$la-css-prefix}-squarespace:before { content: la-content($la-squarespace); } -.#{$la-css-prefix}-stack-exchange:before { content: la-content($la-stack-exchange); } -.#{$la-css-prefix}-stack-overflow:before { content: la-content($la-stack-overflow); } -.#{$la-css-prefix}-stackpath:before { content: la-content($la-stackpath); } -.#{$la-css-prefix}-stamp:before { content: la-content($la-stamp); } -.#{$la-css-prefix}-star:before { content: la-content($la-star); } -.#{$la-css-prefix}-star-and-crescent:before { content: la-content($la-star-and-crescent); } -.#{$la-css-prefix}-star-half:before { content: la-content($la-star-half); } -.#{$la-css-prefix}-star-half-alt:before { content: la-content($la-star-half-alt); } -.#{$la-css-prefix}-star-of-david:before { content: la-content($la-star-of-david); } -.#{$la-css-prefix}-star-of-life:before { content: la-content($la-star-of-life); } -.#{$la-css-prefix}-staylinked:before { content: la-content($la-staylinked); } -.#{$la-css-prefix}-steam:before { content: la-content($la-steam); } -.#{$la-css-prefix}-steam-square:before { content: la-content($la-steam-square); } -.#{$la-css-prefix}-steam-symbol:before { content: la-content($la-steam-symbol); } -.#{$la-css-prefix}-step-backward:before { content: la-content($la-step-backward); } -.#{$la-css-prefix}-step-forward:before { content: la-content($la-step-forward); } -.#{$la-css-prefix}-stethoscope:before { content: la-content($la-stethoscope); } -.#{$la-css-prefix}-sticker-mule:before { content: la-content($la-sticker-mule); } -.#{$la-css-prefix}-sticky-note:before { content: la-content($la-sticky-note); } -.#{$la-css-prefix}-stop:before { content: la-content($la-stop); } -.#{$la-css-prefix}-stop-circle:before { content: la-content($la-stop-circle); } -.#{$la-css-prefix}-stopwatch:before { content: la-content($la-stopwatch); } -.#{$la-css-prefix}-store:before { content: la-content($la-store); } -.#{$la-css-prefix}-store-alt:before { content: la-content($la-store-alt); } -.#{$la-css-prefix}-strava:before { content: la-content($la-strava); } -.#{$la-css-prefix}-stream:before { content: la-content($la-stream); } -.#{$la-css-prefix}-street-view:before { content: la-content($la-street-view); } -.#{$la-css-prefix}-strikethrough:before { content: la-content($la-strikethrough); } -.#{$la-css-prefix}-stripe:before { content: la-content($la-stripe); } -.#{$la-css-prefix}-stripe-s:before { content: la-content($la-stripe-s); } -.#{$la-css-prefix}-stroopwafel:before { content: la-content($la-stroopwafel); } -.#{$la-css-prefix}-studiovinari:before { content: la-content($la-studiovinari); } -.#{$la-css-prefix}-stumbleupon:before { content: la-content($la-stumbleupon); } -.#{$la-css-prefix}-stumbleupon-circle:before { content: la-content($la-stumbleupon-circle); } -.#{$la-css-prefix}-subscript:before { content: la-content($la-subscript); } -.#{$la-css-prefix}-subway:before { content: la-content($la-subway); } -.#{$la-css-prefix}-suitcase:before { content: la-content($la-suitcase); } -.#{$la-css-prefix}-suitcase-rolling:before { content: la-content($la-suitcase-rolling); } -.#{$la-css-prefix}-sun:before { content: la-content($la-sun); } -.#{$la-css-prefix}-superpowers:before { content: la-content($la-superpowers); } -.#{$la-css-prefix}-superscript:before { content: la-content($la-superscript); } -.#{$la-css-prefix}-supple:before { content: la-content($la-supple); } -.#{$la-css-prefix}-surprise:before { content: la-content($la-surprise); } -.#{$la-css-prefix}-suse:before { content: la-content($la-suse); } -.#{$la-css-prefix}-swatchbook:before { content: la-content($la-swatchbook); } -.#{$la-css-prefix}-swimmer:before { content: la-content($la-swimmer); } -.#{$la-css-prefix}-swimming-pool:before { content: la-content($la-swimming-pool); } -.#{$la-css-prefix}-symfony:before { content: la-content($la-symfony); } -.#{$la-css-prefix}-synagogue:before { content: la-content($la-synagogue); } -.#{$la-css-prefix}-sync:before { content: la-content($la-sync); } -.#{$la-css-prefix}-sync-alt:before { content: la-content($la-sync-alt); } -.#{$la-css-prefix}-syringe:before { content: la-content($la-syringe); } -.#{$la-css-prefix}-table:before { content: la-content($la-table); } -.#{$la-css-prefix}-table-tennis:before { content: la-content($la-table-tennis); } -.#{$la-css-prefix}-tablet:before { content: la-content($la-tablet); } -.#{$la-css-prefix}-tablet-alt:before { content: la-content($la-tablet-alt); } -.#{$la-css-prefix}-tablets:before { content: la-content($la-tablets); } -.#{$la-css-prefix}-tachometer-alt:before { content: la-content($la-tachometer-alt); } -.#{$la-css-prefix}-tag:before { content: la-content($la-tag); } -.#{$la-css-prefix}-tags:before { content: la-content($la-tags); } -.#{$la-css-prefix}-tape:before { content: la-content($la-tape); } -.#{$la-css-prefix}-tasks:before { content: la-content($la-tasks); } -.#{$la-css-prefix}-taxi:before { content: la-content($la-taxi); } -.#{$la-css-prefix}-teamspeak:before { content: la-content($la-teamspeak); } -.#{$la-css-prefix}-teeth:before { content: la-content($la-teeth); } -.#{$la-css-prefix}-teeth-open:before { content: la-content($la-teeth-open); } -.#{$la-css-prefix}-telegram:before { content: la-content($la-telegram); } -.#{$la-css-prefix}-telegram-plane:before { content: la-content($la-telegram-plane); } -.#{$la-css-prefix}-temperature-high:before { content: la-content($la-temperature-high); } -.#{$la-css-prefix}-temperature-low:before { content: la-content($la-temperature-low); } -.#{$la-css-prefix}-tencent-weibo:before { content: la-content($la-tencent-weibo); } -.#{$la-css-prefix}-tenge:before { content: la-content($la-tenge); } -.#{$la-css-prefix}-terminal:before { content: la-content($la-terminal); } -.#{$la-css-prefix}-text-height:before { content: la-content($la-text-height); } -.#{$la-css-prefix}-text-width:before { content: la-content($la-text-width); } -.#{$la-css-prefix}-th:before { content: la-content($la-th); } -.#{$la-css-prefix}-th-large:before { content: la-content($la-th-large); } -.#{$la-css-prefix}-th-list:before { content: la-content($la-th-list); } -.#{$la-css-prefix}-the-red-yeti:before { content: la-content($la-the-red-yeti); } -.#{$la-css-prefix}-theater-masks:before { content: la-content($la-theater-masks); } -.#{$la-css-prefix}-themeco:before { content: la-content($la-themeco); } -.#{$la-css-prefix}-themeisle:before { content: la-content($la-themeisle); } -.#{$la-css-prefix}-thermometer:before { content: la-content($la-thermometer); } -.#{$la-css-prefix}-thermometer-empty:before { content: la-content($la-thermometer-empty); } -.#{$la-css-prefix}-thermometer-full:before { content: la-content($la-thermometer-full); } -.#{$la-css-prefix}-thermometer-half:before { content: la-content($la-thermometer-half); } -.#{$la-css-prefix}-thermometer-quarter:before { content: la-content($la-thermometer-quarter); } -.#{$la-css-prefix}-thermometer-three-quarters:before { content: la-content($la-thermometer-three-quarters); } -.#{$la-css-prefix}-think-peaks:before { content: la-content($la-think-peaks); } -.#{$la-css-prefix}-thumbs-down:before { content: la-content($la-thumbs-down); } -.#{$la-css-prefix}-thumbs-up:before { content: la-content($la-thumbs-up); } -.#{$la-css-prefix}-thumbtack:before { content: la-content($la-thumbtack); } -.#{$la-css-prefix}-ticket-alt:before { content: la-content($la-ticket-alt); } -.#{$la-css-prefix}-times:before { content: la-content($la-times); } -.#{$la-css-prefix}-times-circle:before { content: la-content($la-times-circle); } -.#{$la-css-prefix}-tint:before { content: la-content($la-tint); } -.#{$la-css-prefix}-tint-slash:before { content: la-content($la-tint-slash); } -.#{$la-css-prefix}-tired:before { content: la-content($la-tired); } -.#{$la-css-prefix}-toggle-off:before { content: la-content($la-toggle-off); } -.#{$la-css-prefix}-toggle-on:before { content: la-content($la-toggle-on); } -.#{$la-css-prefix}-toilet:before { content: la-content($la-toilet); } -.#{$la-css-prefix}-toilet-paper:before { content: la-content($la-toilet-paper); } -.#{$la-css-prefix}-toolbox:before { content: la-content($la-toolbox); } -.#{$la-css-prefix}-tools:before { content: la-content($la-tools); } -.#{$la-css-prefix}-tooth:before { content: la-content($la-tooth); } -.#{$la-css-prefix}-torah:before { content: la-content($la-torah); } -.#{$la-css-prefix}-torii-gate:before { content: la-content($la-torii-gate); } -.#{$la-css-prefix}-tractor:before { content: la-content($la-tractor); } -.#{$la-css-prefix}-trade-federation:before { content: la-content($la-trade-federation); } -.#{$la-css-prefix}-trademark:before { content: la-content($la-trademark); } -.#{$la-css-prefix}-traffic-light:before { content: la-content($la-traffic-light); } -.#{$la-css-prefix}-train:before { content: la-content($la-train); } -.#{$la-css-prefix}-tram:before { content: la-content($la-tram); } -.#{$la-css-prefix}-transgender:before { content: la-content($la-transgender); } -.#{$la-css-prefix}-transgender-alt:before { content: la-content($la-transgender-alt); } -.#{$la-css-prefix}-trash:before { content: la-content($la-trash); } -.#{$la-css-prefix}-trash-alt:before { content: la-content($la-trash-alt); } -.#{$la-css-prefix}-trash-restore:before { content: la-content($la-trash-restore); } -.#{$la-css-prefix}-trash-restore-alt:before { content: la-content($la-trash-restore-alt); } -.#{$la-css-prefix}-tree:before { content: la-content($la-tree); } -.#{$la-css-prefix}-trello:before { content: la-content($la-trello); } -.#{$la-css-prefix}-tripadvisor:before { content: la-content($la-tripadvisor); } -.#{$la-css-prefix}-trophy:before { content: la-content($la-trophy); } -.#{$la-css-prefix}-truck:before { content: la-content($la-truck); } -.#{$la-css-prefix}-truck-loading:before { content: la-content($la-truck-loading); } -.#{$la-css-prefix}-truck-monster:before { content: la-content($la-truck-monster); } -.#{$la-css-prefix}-truck-moving:before { content: la-content($la-truck-moving); } -.#{$la-css-prefix}-truck-pickup:before { content: la-content($la-truck-pickup); } -.#{$la-css-prefix}-tshirt:before { content: la-content($la-tshirt); } -.#{$la-css-prefix}-tty:before { content: la-content($la-tty); } -.#{$la-css-prefix}-tumblr:before { content: la-content($la-tumblr); } -.#{$la-css-prefix}-tumblr-square:before { content: la-content($la-tumblr-square); } -.#{$la-css-prefix}-tv:before { content: la-content($la-tv); } -.#{$la-css-prefix}-twitch:before { content: la-content($la-twitch); } -.#{$la-css-prefix}-twitter:before { content: la-content($la-twitter); } -.#{$la-css-prefix}-twitter-square:before { content: la-content($la-twitter-square); } -.#{$la-css-prefix}-typo3:before { content: la-content($la-typo3); } -.#{$la-css-prefix}-uber:before { content: la-content($la-uber); } -.#{$la-css-prefix}-ubuntu:before { content: la-content($la-ubuntu); } -.#{$la-css-prefix}-uikit:before { content: la-content($la-uikit); } -.#{$la-css-prefix}-umbrella:before { content: la-content($la-umbrella); } -.#{$la-css-prefix}-umbrella-beach:before { content: la-content($la-umbrella-beach); } -.#{$la-css-prefix}-underline:before { content: la-content($la-underline); } -.#{$la-css-prefix}-undo:before { content: la-content($la-undo); } -.#{$la-css-prefix}-undo-alt:before { content: la-content($la-undo-alt); } -.#{$la-css-prefix}-uniregistry:before { content: la-content($la-uniregistry); } -.#{$la-css-prefix}-universal-access:before { content: la-content($la-universal-access); } -.#{$la-css-prefix}-university:before { content: la-content($la-university); } -.#{$la-css-prefix}-unlink:before { content: la-content($la-unlink); } -.#{$la-css-prefix}-unlock:before { content: la-content($la-unlock); } -.#{$la-css-prefix}-unlock-alt:before { content: la-content($la-unlock-alt); } -.#{$la-css-prefix}-untappd:before { content: la-content($la-untappd); } -.#{$la-css-prefix}-upload:before { content: la-content($la-upload); } -.#{$la-css-prefix}-ups:before { content: la-content($la-ups); } -.#{$la-css-prefix}-usb:before { content: la-content($la-usb); } -.#{$la-css-prefix}-user:before { content: la-content($la-user); } -.#{$la-css-prefix}-user-alt:before { content: la-content($la-user-alt); } -.#{$la-css-prefix}-user-alt-slash:before { content: la-content($la-user-alt-slash); } -.#{$la-css-prefix}-user-astronaut:before { content: la-content($la-user-astronaut); } -.#{$la-css-prefix}-user-check:before { content: la-content($la-user-check); } -.#{$la-css-prefix}-user-circle:before { content: la-content($la-user-circle); } -.#{$la-css-prefix}-user-clock:before { content: la-content($la-user-clock); } -.#{$la-css-prefix}-user-cog:before { content: la-content($la-user-cog); } -.#{$la-css-prefix}-user-edit:before { content: la-content($la-user-edit); } -.#{$la-css-prefix}-user-friends:before { content: la-content($la-user-friends); } -.#{$la-css-prefix}-user-graduate:before { content: la-content($la-user-graduate); } -.#{$la-css-prefix}-user-injured:before { content: la-content($la-user-injured); } -.#{$la-css-prefix}-user-lock:before { content: la-content($la-user-lock); } -.#{$la-css-prefix}-user-md:before { content: la-content($la-user-md); } -.#{$la-css-prefix}-user-minus:before { content: la-content($la-user-minus); } -.#{$la-css-prefix}-user-ninja:before { content: la-content($la-user-ninja); } -.#{$la-css-prefix}-user-nurse:before { content: la-content($la-user-nurse); } -.#{$la-css-prefix}-user-plus:before { content: la-content($la-user-plus); } -.#{$la-css-prefix}-user-secret:before { content: la-content($la-user-secret); } -.#{$la-css-prefix}-user-shield:before { content: la-content($la-user-shield); } -.#{$la-css-prefix}-user-slash:before { content: la-content($la-user-slash); } -.#{$la-css-prefix}-user-tag:before { content: la-content($la-user-tag); } -.#{$la-css-prefix}-user-tie:before { content: la-content($la-user-tie); } -.#{$la-css-prefix}-user-times:before { content: la-content($la-user-times); } -.#{$la-css-prefix}-users:before { content: la-content($la-users); } -.#{$la-css-prefix}-users-cog:before { content: la-content($la-users-cog); } -.#{$la-css-prefix}-usps:before { content: la-content($la-usps); } -.#{$la-css-prefix}-ussunnah:before { content: la-content($la-ussunnah); } -.#{$la-css-prefix}-utensil-spoon:before { content: la-content($la-utensil-spoon); } -.#{$la-css-prefix}-utensils:before { content: la-content($la-utensils); } -.#{$la-css-prefix}-vaadin:before { content: la-content($la-vaadin); } -.#{$la-css-prefix}-vector-square:before { content: la-content($la-vector-square); } -.#{$la-css-prefix}-venus:before { content: la-content($la-venus); } -.#{$la-css-prefix}-venus-double:before { content: la-content($la-venus-double); } -.#{$la-css-prefix}-venus-mars:before { content: la-content($la-venus-mars); } -.#{$la-css-prefix}-viacoin:before { content: la-content($la-viacoin); } -.#{$la-css-prefix}-viadeo:before { content: la-content($la-viadeo); } -.#{$la-css-prefix}-viadeo-square:before { content: la-content($la-viadeo-square); } -.#{$la-css-prefix}-vial:before { content: la-content($la-vial); } -.#{$la-css-prefix}-vials:before { content: la-content($la-vials); } -.#{$la-css-prefix}-viber:before { content: la-content($la-viber); } -.#{$la-css-prefix}-video:before { content: la-content($la-video); } -.#{$la-css-prefix}-video-slash:before { content: la-content($la-video-slash); } -.#{$la-css-prefix}-vihara:before { content: la-content($la-vihara); } -.#{$la-css-prefix}-vimeo:before { content: la-content($la-vimeo); } -.#{$la-css-prefix}-vimeo-square:before { content: la-content($la-vimeo-square); } -.#{$la-css-prefix}-vimeo-v:before { content: la-content($la-vimeo-v); } -.#{$la-css-prefix}-vine:before { content: la-content($la-vine); } -.#{$la-css-prefix}-vk:before { content: la-content($la-vk); } -.#{$la-css-prefix}-vnv:before { content: la-content($la-vnv); } -.#{$la-css-prefix}-voicemail:before { content: la-content($la-voicemail); } -.#{$la-css-prefix}-volleyball-ball:before { content: la-content($la-volleyball-ball); } -.#{$la-css-prefix}-volume-down:before { content: la-content($la-volume-down); } -.#{$la-css-prefix}-volume-mute:before { content: la-content($la-volume-mute); } -.#{$la-css-prefix}-volume-off:before { content: la-content($la-volume-off); } -.#{$la-css-prefix}-volume-up:before { content: la-content($la-volume-up); } -.#{$la-css-prefix}-vote-yea:before { content: la-content($la-vote-yea); } -.#{$la-css-prefix}-vr-cardboard:before { content: la-content($la-vr-cardboard); } -.#{$la-css-prefix}-vuejs:before { content: la-content($la-vuejs); } -.#{$la-css-prefix}-walking:before { content: la-content($la-walking); } -.#{$la-css-prefix}-wallet:before { content: la-content($la-wallet); } -.#{$la-css-prefix}-warehouse:before { content: la-content($la-warehouse); } -.#{$la-css-prefix}-water:before { content: la-content($la-water); } -.#{$la-css-prefix}-wave-square:before { content: la-content($la-wave-square); } -.#{$la-css-prefix}-waze:before { content: la-content($la-waze); } -.#{$la-css-prefix}-weebly:before { content: la-content($la-weebly); } -.#{$la-css-prefix}-weibo:before { content: la-content($la-weibo); } -.#{$la-css-prefix}-weight:before { content: la-content($la-weight); } -.#{$la-css-prefix}-weight-hanging:before { content: la-content($la-weight-hanging); } -.#{$la-css-prefix}-weixin:before { content: la-content($la-weixin); } -.#{$la-css-prefix}-whatsapp:before { content: la-content($la-whatsapp); } -.#{$la-css-prefix}-whatsapp-square:before { content: la-content($la-whatsapp-square); } -.#{$la-css-prefix}-wheelchair:before { content: la-content($la-wheelchair); } -.#{$la-css-prefix}-whmcs:before { content: la-content($la-whmcs); } -.#{$la-css-prefix}-wifi:before { content: la-content($la-wifi); } -.#{$la-css-prefix}-wikipedia-w:before { content: la-content($la-wikipedia-w); } -.#{$la-css-prefix}-wind:before { content: la-content($la-wind); } -.#{$la-css-prefix}-window-close:before { content: la-content($la-window-close); } -.#{$la-css-prefix}-window-maximize:before { content: la-content($la-window-maximize); } -.#{$la-css-prefix}-window-minimize:before { content: la-content($la-window-minimize); } -.#{$la-css-prefix}-window-restore:before { content: la-content($la-window-restore); } -.#{$la-css-prefix}-windows:before { content: la-content($la-windows); } -.#{$la-css-prefix}-wine-bottle:before { content: la-content($la-wine-bottle); } -.#{$la-css-prefix}-wine-glass:before { content: la-content($la-wine-glass); } -.#{$la-css-prefix}-wine-glass-alt:before { content: la-content($la-wine-glass-alt); } -.#{$la-css-prefix}-wix:before { content: la-content($la-wix); } -.#{$la-css-prefix}-wizards-of-the-coast:before { content: la-content($la-wizards-of-the-coast); } -.#{$la-css-prefix}-wolf-pack-battalion:before { content: la-content($la-wolf-pack-battalion); } -.#{$la-css-prefix}-won-sign:before { content: la-content($la-won-sign); } -.#{$la-css-prefix}-wordpress:before { content: la-content($la-wordpress); } -.#{$la-css-prefix}-wordpress-simple:before { content: la-content($la-wordpress-simple); } -.#{$la-css-prefix}-wpbeginner:before { content: la-content($la-wpbeginner); } -.#{$la-css-prefix}-wpexplorer:before { content: la-content($la-wpexplorer); } -.#{$la-css-prefix}-wpforms:before { content: la-content($la-wpforms); } -.#{$la-css-prefix}-wpressr:before { content: la-content($la-wpressr); } -.#{$la-css-prefix}-wrench:before { content: la-content($la-wrench); } -.#{$la-css-prefix}-x-ray:before { content: la-content($la-x-ray); } -.#{$la-css-prefix}-xbox:before { content: la-content($la-xbox); } -.#{$la-css-prefix}-xing:before { content: la-content($la-xing); } -.#{$la-css-prefix}-xing-square:before { content: la-content($la-xing-square); } -.#{$la-css-prefix}-y-combinator:before { content: la-content($la-y-combinator); } -.#{$la-css-prefix}-yahoo:before { content: la-content($la-yahoo); } -.#{$la-css-prefix}-yammer:before { content: la-content($la-yammer); } -.#{$la-css-prefix}-yandex:before { content: la-content($la-yandex); } -.#{$la-css-prefix}-yandex-international:before { content: la-content($la-yandex-international); } -.#{$la-css-prefix}-yarn:before { content: la-content($la-yarn); } -.#{$la-css-prefix}-yelp:before { content: la-content($la-yelp); } -.#{$la-css-prefix}-yen-sign:before { content: la-content($la-yen-sign); } -.#{$la-css-prefix}-yin-yang:before { content: la-content($la-yin-yang); } -.#{$la-css-prefix}-yoast:before { content: la-content($la-yoast); } -.#{$la-css-prefix}-youtube:before { content: la-content($la-youtube); } -.#{$la-css-prefix}-youtube-square:before { content: la-content($la-youtube-square); } -.#{$la-css-prefix}-zhihu:before { content: la-content($la-zhihu); } -.#{$la-css-prefix}-hat-cowboy:before { content: la-content($la-hat-cowboy); } -.#{$la-css-prefix}-hat-cowboy-side:before { content: la-content($la-hat-cowboy-side); } -.#{$la-css-prefix}-mdb:before { content: la-content($la-mdb); } -.#{$la-css-prefix}-mouse:before { content: la-content($la-mouse); } -.#{$la-css-prefix}-orcid:before { content: la-content($la-orcid); } -.#{$la-css-prefix}-record-vinyl:before { content: la-content($la-record-vinyl); } -.#{$la-css-prefix}-swift:before { content: la-content($la-swift); } -.#{$la-css-prefix}-umbraco:before { content: la-content($la-umbraco); } -.#{$la-css-prefix}-buy-n-large:before { content: la-content($la-buy-n-large); } diff --git a/python/static/scss/_larger.scss b/python/static/scss/_larger.scss deleted file mode 100644 index fc4ba90..0000000 --- a/python/static/scss/_larger.scss +++ /dev/null @@ -1,22 +0,0 @@ -.#{$la-css-prefix}-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -.0667em; -} - -.#{$la-css-prefix}-xs { font-size: 0.75em; } -.#{$la-css-prefix}-2x { font-size: 1em; } -.#{$la-css-prefix}-2x { font-size: 2em; } -.#{$la-css-prefix}-3x { font-size: 3em; } -.#{$la-css-prefix}-4x { font-size: 4em; } -.#{$la-css-prefix}-5x { font-size: 5em; } -.#{$la-css-prefix}-6x { font-size: 6em; } -.#{$la-css-prefix}-7x { font-size: 7em; } -.#{$la-css-prefix}-8x { font-size: 8em; } -.#{$la-css-prefix}-9x { font-size: 9em; } -.#{$la-css-prefix}-10x { font-size: 10em; } - -.#{$la-css-prefix}-fw { - text-align: center; - width: 1.25em; -} diff --git a/python/static/scss/_list.scss b/python/static/scss/_list.scss deleted file mode 100644 index 5e69fbc..0000000 --- a/python/static/scss/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -.#{$la-css-prefix}-ul { - padding-left: 0; - margin-left: $la-li-width; - list-style-type: none; - > li { - position: relative; - } -} - -.#{$la-css-prefix}-li { - position: absolute; - left: -2em; - text-align: center; - width: $la-li-width; - line-height: inherit; - &.#{$la-css-prefix}-lg { - left: -$la-li-width + (4em / 14); - } -} diff --git a/python/static/scss/_mixins.scss b/python/static/scss/_mixins.scss deleted file mode 100644 index de80b5e..0000000 --- a/python/static/scss/_mixins.scss +++ /dev/null @@ -1,32 +0,0 @@ -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -@mixin sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} - -// 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 { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; - } -} diff --git a/python/static/scss/_path.scss b/python/static/scss/_path.scss deleted file mode 100644 index 8354fc3..0000000 --- a/python/static/scss/_path.scss +++ /dev/null @@ -1,53 +0,0 @@ -@font-face { - font-family: $la-font-name-lab; - font-style: normal; - font-weight: normal; - font-display: auto; - src: url('#{$la-font-path}/la-brands-400.eot'); - src: url("#{$la-font-path}/la-brands-400.eot?#iefix") format("embedded-opentype"), - url("#{$la-font-path}/la-brands-400.woff2") format("woff2"), - url("#{$la-font-path}/la-brands-400.woff") format("woff"), - url("#{$la-font-path}/la-brands-400.ttf") format("truetype"), - url("#{$la-font-path}/la-brands-400.svg#lineawesome") format("svg"); -} - -.#{$la-css-prefix-lab} { - font-family: $la-font-name-lab; - font-weight: 400; -} - -@font-face { - font-family: $la-font-name-lar; - font-style: normal; - font-weight: 400; - font-display: auto; - src: url('#{$la-font-path}/la-regular-400.eot'); - src: url("#{$la-font-path}/la-regular-400.eot?#iefix") format("embedded-opentype"), - url("#{$la-font-path}/la-regular-400.woff2") format("woff2"), - url("#{$la-font-path}/la-regular-400.woff") format("woff"), - url("#{$la-font-path}/la-regular-400.ttf") format("truetype"), - url("#{$la-font-path}/la-regular-400.svg#lineawesome") format("svg"); -} - -.#{$la-css-prefix-lar} { - font-family: $la-font-name-lar; - font-weight: 400; -} - -@font-face { - font-family: $la-font-name-las; - font-style: normal; - font-weight: 900; - font-display: auto; - src: url('#{$la-font-path}/la-solid-900.eot'); - src: url("#{$la-font-path}/la-solid-900.eot?#iefix") format("embedded-opentype"), - url("#{$la-font-path}/la-solid-900.woff2") format("woff2"), - url("#{$la-font-path}/la-solid-900.woff") format("woff"), - url("#{$la-font-path}/la-solid-900.ttf") format("truetype"), - url("#{$la-font-path}/la-solid-900.svg#lineawesome") format("svg"); -} - -.#{$la-css-prefix-las} { - font-family: $la-font-name-las; - font-weight: 900; -} diff --git a/python/static/scss/_rotated-flipped.scss b/python/static/scss/_rotated-flipped.scss deleted file mode 100644 index f0f8ec2..0000000 --- a/python/static/scss/_rotated-flipped.scss +++ /dev/null @@ -1,101 +0,0 @@ -.la-pull-left { - float: left; -} - -.la-pull-right { - float: right; -} - -.la.la-pull-left, -.las.la-pull-left, -.lar.la-pull-left, -.lal.la-pull-left, -.lab.la-pull-left { - margin-right: .3em; -} - -.la.la-pull-right, -.las.la-pull-right, -.lar.la-pull-right, -.lal.la-pull-right, -.lab.la-pull-right { - margin-left: .3em; -} - -.la-spin { - -webkit-animation: la-spin 2s infinite linear; - animation: la-spin 2s infinite linear; -} - -.la-pulse { - -webkit-animation: la-spin 1s infinite steps(8); - animation: la-spin 1s infinite steps(8); -} - -@-webkit-keyframes la-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes la-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -.la-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} - -.la-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} - -.la-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); -} - -.la-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); -} - -.la-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); -} - -.la-flip-both, .la-flip-horizontal.la-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); -} - -:root .la-rotate-90, -:root .la-rotate-180, -:root .la-rotate-270, -:root .la-flip-horizontal, -:root .la-flip-vertical, -:root .la-flip-both { - -webkit-filter: none; - filter: none; -} diff --git a/python/static/scss/_screen-reader.scss b/python/static/scss/_screen-reader.scss deleted file mode 100644 index bcb5455..0000000 --- a/python/static/scss/_screen-reader.scss +++ /dev/null @@ -1,2 +0,0 @@ -.sr-only { @include sr-only(); } -.sr-only-focusable { @include sr-only-focusable(); } diff --git a/python/static/scss/_stacked.scss b/python/static/scss/_stacked.scss deleted file mode 100644 index c6c63dd..0000000 --- a/python/static/scss/_stacked.scss +++ /dev/null @@ -1,28 +0,0 @@ -.#{$la-css-prefix}-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2.5em; -} - -.#{$la-css-prefix}-stack-1x, -.#{$la-css-prefix}-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; -} - -.#{$la-css-prefix}-stack-1x { - line-height: inherit; -} - -.#{$la-css-prefix}-stack-2x { - font-size: 2em; -} - -.#{$la-css-prefix}-inverse { - color: $la-inverse; -} diff --git a/python/static/scss/_variables.scss b/python/static/scss/_variables.scss deleted file mode 100644 index ad3322f..0000000 --- a/python/static/scss/_variables.scss +++ /dev/null @@ -1,1416 +0,0 @@ -$la-font-path: "../fonts" !default; -$la-font-size-base: 14px !default; -$la-line-height-base: 1 !default; -$la-border-color: #eee !default; -$la-inverse: #fff !default; -$la-version: 1.3.0 !default; -$la-li-width: (20em / 14) !default; - -@function la-content($la-var) { - @return unquote("\"#{ $la-var }\""); -} - -$la-css-prefix: la; - -$la-font-name-lar: Line Awesome Free !default; -$la-css-prefix-lar: lar !default; - -$la-font-name-las: Line Awesome Free !default; -$la-css-prefix-las: las !default; - -$la-font-name-lab: Line Awesome Brands !default; -$la-css-prefix-lab: lab !default; - -$la-500px: \f26e; -$la-accessible-icon: \f368; -$la-accusoft: \f369; -$la-acquisitions-incorporated: \f6af; -$la-ad: \f641; -$la-address-book: \f2b9; -$la-address-card: \f2bb; -$la-adjust: \f042; -$la-adn: \f170; -$la-adobe: \f778; -$la-adversal: \f36a; -$la-affiliatetheme: \f36b; -$la-air-freshener: \f5d0; -$la-airbnb: \f834; -$la-algolia: \f36c; -$la-align-center: \f037; -$la-align-justify: \f039; -$la-align-left: \f036; -$la-align-right: \f038; -$la-alipay: \f642; -$la-allergies: \f461; -$la-amazon: \f270; -$la-amazon-pay: \f42c; -$la-ambulance: \f0f9; -$la-american-sign-language-interpreting: \f2a3; -$la-amilia: \f36d; -$la-anchor: \f13d; -$la-android: \f17b; -$la-angellist: \f209; -$la-angle-double-down: \f103; -$la-angle-double-left: \f100; -$la-angle-double-right: \f101; -$la-angle-double-up: \f102; -$la-angle-down: \f107; -$la-angle-left: \f104; -$la-angle-right: \f105; -$la-angle-up: \f106; -$la-angry: \f556; -$la-angrycreative: \f36e; -$la-angular: \f420; -$la-ankh: \f644; -$la-app-store: \f36f; -$la-app-store-ios: \f370; -$la-apper: \f371; -$la-apple: \f179; -$la-apple-alt: \f5d1; -$la-apple-pay: \f415; -$la-archive: \f187; -$la-archway: \f557; -$la-arrow-alt-circle-down: \f358; -$la-arrow-alt-circle-left: \f359; -$la-arrow-alt-circle-right: \f35a; -$la-arrow-alt-circle-up: \f35b; -$la-arrow-circle-down: \f0ab; -$la-arrow-circle-left: \f0a8; -$la-arrow-circle-right: \f0a9; -$la-arrow-circle-up: \f0aa; -$la-arrow-down: \f063; -$la-arrow-left: \f060; -$la-arrow-right: \f061; -$la-arrow-up: \f062; -$la-arrows-alt: \f0b2; -$la-arrows-alt-h: \f337; -$la-arrows-alt-v: \f338; -$la-artstation: \f77a; -$la-assistive-listening-systems: \f2a2; -$la-asterisk: \f069; -$la-asymmetrik: \f372; -$la-at: \f1fa; -$la-atlas: \f558; -$la-atlassian: \f77b; -$la-atom: \f5d2; -$la-audible: \f373; -$la-audio-description: \f29e; -$la-autoprefixer: \f41c; -$la-avianex: \f374; -$la-aviato: \f421; -$la-award: \f559; -$la-aws: \f375; -$la-baby: \f77c; -$la-baby-carriage: \f77d; -$la-backspace: \f55a; -$la-backward: \f04a; -$la-bacon: \f7e5; -$la-balance-scale: \f24e; -$la-balance-scale-left: \f515; -$la-balance-scale-right: \f516; -$la-ban: \f05e; -$la-band-aid: \f462; -$la-bandcamp: \f2d5; -$la-barcode: \f02a; -$la-bars: \f0c9; -$la-baseball-ball: \f433; -$la-basketball-ball: \f434; -$la-bath: \f2cd; -$la-battery-empty: \f244; -$la-battery-full: \f240; -$la-battery-half: \f242; -$la-battery-quarter: \f243; -$la-battery-three-quarters: \f241; -$la-battle-net: \f835; -$la-bed: \f236; -$la-beer: \f0fc; -$la-behance: \f1b4; -$la-behance-square: \f1b5; -$la-bell: \f0f3; -$la-bell-slash: \f1f6; -$la-bezier-curve: \f55b; -$la-bible: \f647; -$la-bicycle: \f206; -$la-biking: \f84a; -$la-bimobject: \f378; -$la-binoculars: \f1e5; -$la-biohazard: \f780; -$la-birthday-cake: \f1fd; -$la-bitbucket: \f171; -$la-bitcoin: \f379; -$la-bity: \f37a; -$la-black-tie: \f27e; -$la-blackberry: \f37b; -$la-blender: \f517; -$la-blender-phone: \f6b6; -$la-blind: \f29d; -$la-blog: \f781; -$la-blogger: \f37c; -$la-blogger-b: \f37d; -$la-bluetooth: \f293; -$la-bluetooth-b: \f294; -$la-bold: \f032; -$la-bolt: \f0e7; -$la-bomb: \f1e2; -$la-bone: \f5d7; -$la-bong: \f55c; -$la-book: \f02d; -$la-book-dead: \f6b7; -$la-book-medical: \f7e6; -$la-book-open: \f518; -$la-book-reader: \f5da; -$la-bookmark: \f02e; -$la-bootstrap: \f836; -$la-border-all: \f84c; -$la-border-none: \f850; -$la-border-style: \f853; -$la-bowling-ball: \f436; -$la-box: \f466; -$la-box-open: \f49e; -$la-boxes: \f468; -$la-braille: \f2a1; -$la-brain: \f5dc; -$la-bread-slice: \f7ec; -$la-briefcase: \f0b1; -$la-briefcase-medical: \f469; -$la-broadcast-tower: \f519; -$la-broom: \f51a; -$la-brush: \f55d; -$la-btc: \f15a; -$la-buffer: \f837; -$la-bug: \f188; -$la-building: \f1ad; -$la-bullhorn: \f0a1; -$la-bullseye: \f140; -$la-burn: \f46a; -$la-buromobelexperte: \f37f; -$la-bus: \f207; -$la-bus-alt: \f55e; -$la-business-time: \f64a; -$la-buysellads: \f20d; -$la-calculator: \f1ec; -$la-calendar: \f133; -$la-calendar-alt: \f073; -$la-calendar-check: \f274; -$la-calendar-day: \f783; -$la-calendar-minus: \f272; -$la-calendar-plus: \f271; -$la-calendar-times: \f273; -$la-calendar-week: \f784; -$la-camera: \f030; -$la-camera-retro: \f083; -$la-campground: \f6bb; -$la-canadian-maple-leaf: \f785; -$la-candy-cane: \f786; -$la-cannabis: \f55f; -$la-capsules: \f46b; -$la-car: \f1b9; -$la-car-alt: \f5de; -$la-car-battery: \f5df; -$la-car-crash: \f5e1; -$la-car-side: \f5e4; -$la-caret-down: \f0d7; -$la-caret-left: \f0d9; -$la-caret-right: \f0da; -$la-caret-square-down: \f150; -$la-caret-square-left: \f191; -$la-caret-square-right: \f152; -$la-caret-square-up: \f151; -$la-caret-up: \f0d8; -$la-carrot: \f787; -$la-cart-arrow-down: \f218; -$la-cart-plus: \f217; -$la-cash-register: \f788; -$la-cat: \f6be; -$la-cc-amazon-pay: \f42d; -$la-cc-amex: \f1f3; -$la-cc-apple-pay: \f416; -$la-cc-diners-club: \f24c; -$la-cc-discover: \f1f2; -$la-cc-jcb: \f24b; -$la-cc-mastercard: \f1f1; -$la-cc-paypal: \f1f4; -$la-cc-stripe: \f1f5; -$la-cc-visa: \f1f0; -$la-centercode: \f380; -$la-centos: \f789; -$la-certificate: \f0a3; -$la-chair: \f6c0; -$la-chalkboard: \f51b; -$la-chalkboard-teacher: \f51c; -$la-charging-station: \f5e7; -$la-chart-area: \f1fe; -$la-chart-bar: \f080; -$la-chart-line: \f201; -$la-chart-pie: \f200; -$la-check: \f00c; -$la-check-circle: \f058; -$la-check-double: \f560; -$la-check-square: \f14a; -$la-cheese: \f7ef; -$la-chess: \f439; -$la-chess-bishop: \f43a; -$la-chess-board: \f43c; -$la-chess-king: \f43f; -$la-chess-knight: \f441; -$la-chess-pawn: \f443; -$la-chess-queen: \f445; -$la-chess-rook: \f447; -$la-chevron-circle-down: \f13a; -$la-chevron-circle-left: \f137; -$la-chevron-circle-right: \f138; -$la-chevron-circle-up: \f139; -$la-chevron-down: \f078; -$la-chevron-left: \f053; -$la-chevron-right: \f054; -$la-chevron-up: \f077; -$la-child: \f1ae; -$la-chrome: \f268; -$la-chromecast: \f838; -$la-church: \f51d; -$la-circle: \f111; -$la-circle-notch: \f1ce; -$la-city: \f64f; -$la-clinic-medical: \f7f2; -$la-clipboard: \f328; -$la-clipboard-check: \f46c; -$la-clipboard-list: \f46d; -$la-clock: \f017; -$la-clone: \f24d; -$la-closed-captioning: \f20a; -$la-cloud: \f0c2; -$la-cloud-download-alt: \f381; -$la-cloud-meatball: \f73b; -$la-cloud-moon: \f6c3; -$la-cloud-moon-rain: \f73c; -$la-cloud-rain: \f73d; -$la-cloud-showers-heavy: \f740; -$la-cloud-sun: \f6c4; -$la-cloud-sun-rain: \f743; -$la-cloud-upload-alt: \f382; -$la-cloudscale: \f383; -$la-cloudsmith: \f384; -$la-cloudversify: \f385; -$la-cocktail: \f561; -$la-code: \f121; -$la-code-branch: \f126; -$la-codepen: \f1cb; -$la-codiepie: \f284; -$la-coffee: \f0f4; -$la-cog: \f013; -$la-cogs: \f085; -$la-coins: \f51e; -$la-columns: \f0db; -$la-comment: \f075; -$la-comment-alt: \f27a; -$la-comment-dollar: \f651; -$la-comment-dots: \f4ad; -$la-comment-medical: \f7f5; -$la-comment-slash: \f4b3; -$la-comments: \f086; -$la-comments-dollar: \f653; -$la-compact-disc: \f51f; -$la-compass: \f14e; -$la-compress: \f066; -$la-compress-arrows-alt: \f78c; -$la-concierge-bell: \f562; -$la-confluence: \f78d; -$la-connectdevelop: \f20e; -$la-contao: \f26d; -$la-cookie: \f563; -$la-cookie-bite: \f564; -$la-copy: \f0c5; -$la-copyright: \f1f9; -$la-cotton-bureau: \f89e; -$la-couch: \f4b8; -$la-cpanel: \f388; -$la-creative-commons: \f25e; -$la-creative-commons-by: \f4e7; -$la-creative-commons-nc: \f4e8; -$la-creative-commons-nc-eu: \f4e9; -$la-creative-commons-nc-jp: \f4ea; -$la-creative-commons-nd: \f4eb; -$la-creative-commons-pd: \f4ec; -$la-creative-commons-pd-alt: \f4ed; -$la-creative-commons-remix: \f4ee; -$la-creative-commons-sa: \f4ef; -$la-creative-commons-sampling: \f4f0; -$la-creative-commons-sampling-plus: \f4f1; -$la-creative-commons-share: \f4f2; -$la-creative-commons-zero: \f4f3; -$la-credit-card: \f09d; -$la-critical-role: \f6c9; -$la-crop: \f125; -$la-crop-alt: \f565; -$la-cross: \f654; -$la-crosshairs: \f05b; -$la-crow: \f520; -$la-crown: \f521; -$la-crutch: \f7f7; -$la-css3: \f13c; -$la-css3-alt: \f38b; -$la-cube: \f1b2; -$la-cubes: \f1b3; -$la-cut: \f0c4; -$la-cuttlefish: \f38c; -$la-d-and-d: \f38d; -$la-d-and-d-beyond: \f6ca; -$la-dashcube: \f210; -$la-database: \f1c0; -$la-deaf: \f2a4; -$la-delicious: \f1a5; -$la-democrat: \f747; -$la-deploydog: \f38e; -$la-deskpro: \f38f; -$la-desktop: \f108; -$la-dev: \f6cc; -$la-deviantart: \f1bd; -$la-dharmachakra: \f655; -$la-dhl: \f790; -$la-diagnoses: \f470; -$la-diaspora: \f791; -$la-dice: \f522; -$la-dice-d20: \f6cf; -$la-dice-d6: \f6d1; -$la-dice-five: \f523; -$la-dice-four: \f524; -$la-dice-one: \f525; -$la-dice-six: \f526; -$la-dice-three: \f527; -$la-dice-two: \f528; -$la-digg: \f1a6; -$la-digital-ocean: \f391; -$la-digital-tachograph: \f566; -$la-directions: \f5eb; -$la-discord: \f392; -$la-discourse: \f393; -$la-divide: \f529; -$la-dizzy: \f567; -$la-dna: \f471; -$la-dochub: \f394; -$la-docker: \f395; -$la-dog: \f6d3; -$la-dollar-sign: \f155; -$la-dolly: \f472; -$la-dolly-flatbed: \f474; -$la-donate: \f4b9; -$la-door-closed: \f52a; -$la-door-open: \f52b; -$la-dot-circle: \f192; -$la-dove: \f4ba; -$la-download: \f019; -$la-draft2digital: \f396; -$la-drafting-compass: \f568; -$la-dragon: \f6d5; -$la-draw-polygon: \f5ee; -$la-dribbble: \f17d; -$la-dribbble-square: \f397; -$la-dropbox: \f16b; -$la-drum: \f569; -$la-drum-steelpan: \f56a; -$la-drumstick-bite: \f6d7; -$la-drupal: \f1a9; -$la-dumbbell: \f44b; -$la-dumpster: \f793; -$la-dumpster-fire: \f794; -$la-dungeon: \f6d9; -$la-dyalog: \f399; -$la-earlybirds: \f39a; -$la-ebay: \f4f4; -$la-edge: \f282; -$la-edit: \f044; -$la-egg: \f7fb; -$la-eject: \f052; -$la-elementor: \f430; -$la-ellipsis-h: \f141; -$la-ellipsis-v: \f142; -$la-ello: \f5f1; -$la-ember: \f423; -$la-empire: \f1d1; -$la-envelope: \f0e0; -$la-envelope-open: \f2b6; -$la-envelope-open-text: \f658; -$la-envelope-square: \f199; -$la-envira: \f299; -$la-equals: \f52c; -$la-eraser: \f12d; -$la-erlang: \f39d; -$la-ethereum: \f42e; -$la-ethernet: \f796; -$la-etsy: \f2d7; -$la-euro-sign: \f153; -$la-evernote: \f839; -$la-exchange-alt: \f362; -$la-exclamation: \f12a; -$la-exclamation-circle: \f06a; -$la-exclamation-triangle: \f071; -$la-expand: \f065; -$la-expand-arrows-alt: \f31e; -$la-expeditedssl: \f23e; -$la-external-link-alt: \f35d; -$la-external-link-square-alt: \f360; -$la-eye: \f06e; -$la-eye-dropper: \f1fb; -$la-eye-slash: \f070; -$la-facebook: \f09a; -$la-facebook-f: \f39e; -$la-facebook-messenger: \f39f; -$la-facebook-square: \f082; -$la-fan: \f863; -$la-fantasy-flight-games: \f6dc; -$la-fast-backward: \f049; -$la-fast-forward: \f050; -$la-fax: \f1ac; -$la-feather: \f52d; -$la-feather-alt: \f56b; -$la-fedex: \f797; -$la-fedora: \f798; -$la-female: \f182; -$la-fighter-jet: \f0fb; -$la-figma: \f799; -$la-file: \f15b; -$la-file-alt: \f15c; -$la-file-archive: \f1c6; -$la-file-audio: \f1c7; -$la-file-code: \f1c9; -$la-file-contract: \f56c; -$la-file-csv: \f6dd; -$la-file-download: \f56d; -$la-file-excel: \f1c3; -$la-file-export: \f56e; -$la-file-image: \f1c5; -$la-file-import: \f56f; -$la-file-invoice: \f570; -$la-file-invoice-dollar: \f571; -$la-file-medical: \f477; -$la-file-medical-alt: \f478; -$la-file-pdf: \f1c1; -$la-file-powerpoint: \f1c4; -$la-file-prescription: \f572; -$la-file-signature: \f573; -$la-file-upload: \f574; -$la-file-video: \f1c8; -$la-file-word: \f1c2; -$la-fill: \f575; -$la-fill-drip: \f576; -$la-film: \f008; -$la-filter: \f0b0; -$la-fingerprint: \f577; -$la-fire: \f06d; -$la-fire-alt: \f7e4; -$la-fire-extinguisher: \f134; -$la-firefox: \f269; -$la-first-aid: \f479; -$la-first-order: \f2b0; -$la-first-order-alt: \f50a; -$la-firstdraft: \f3a1; -$la-fish: \f578; -$la-fist-raised: \f6de; -$la-flag: \f024; -$la-flag-checkered: \f11e; -$la-flag-usa: \f74d; -$la-flask: \f0c3; -$la-flickr: \f16e; -$la-flipboard: \f44d; -$la-flushed: \f579; -$la-fly: \f417; -$la-folder: \f07b; -$la-folder-minus: \f65d; -$la-folder-open: \f07c; -$la-folder-plus: \f65e; -$la-font: \f031; -$la-font-awesome: \f2b4; -$la-font-awesome-alt: \f35c; -$la-font-awesome-flag: \f425; -$la-fonticons: \f280; -$la-fonticons-fi: \f3a2; -$la-football-ball: \f44e; -$la-fort-awesome: \f286; -$la-fort-awesome-alt: \f3a3; -$la-forumbee: \f211; -$la-forward: \f04e; -$la-foursquare: \f180; -$la-free-code-camp: \f2c5; -$la-freebsd: \f3a4; -$la-frog: \f52e; -$la-frown: \f119; -$la-frown-open: \f57a; -$la-fulcrum: \f50b; -$la-funnel-dollar: \f662; -$la-futbol: \f1e3; -$la-galactic-republic: \f50c; -$la-galactic-senate: \f50d; -$la-gamepad: \f11b; -$la-gas-pump: \f52f; -$la-gavel: \f0e3; -$la-gem: \f3a5; -$la-genderless: \f22d; -$la-get-pocket: \f265; -$la-gg: \f260; -$la-gg-circle: \f261; -$la-ghost: \f6e2; -$la-gift: \f06b; -$la-gifts: \f79c; -$la-git: \f1d3; -$la-git-alt: \f841; -$la-git-square: \f1d2; -$la-github: \f09b; -$la-github-alt: \f113; -$la-github-square: \f092; -$la-gitkraken: \f3a6; -$la-gitlab: \f296; -$la-gitter: \f426; -$la-glass-cheers: \f79f; -$la-glass-martini: \f000; -$la-glass-martini-alt: \f57b; -$la-glass-whiskey: \f7a0; -$la-glasses: \f530; -$la-glide: \f2a5; -$la-glide-g: \f2a6; -$la-globe: \f0ac; -$la-globe-africa: \f57c; -$la-globe-americas: \f57d; -$la-globe-asia: \f57e; -$la-globe-europe: \f7a2; -$la-gofore: \f3a7; -$la-golf-ball: \f450; -$la-goodreads: \f3a8; -$la-goodreads-g: \f3a9; -$la-google: \f1a0; -$la-google-drive: \f3aa; -$la-google-play: \f3ab; -$la-google-plus: \f2b3; -$la-google-plus-g: \f0d5; -$la-google-plus-square: \f0d4; -$la-google-wallet: \f1ee; -$la-gopuram: \f664; -$la-graduation-cap: \f19d; -$la-gratipay: \f184; -$la-grav: \f2d6; -$la-greater-than: \f531; -$la-greater-than-equal: \f532; -$la-grimace: \f57f; -$la-grin: \f580; -$la-grin-alt: \f581; -$la-grin-beam: \f582; -$la-grin-beam-sweat: \f583; -$la-grin-hearts: \f584; -$la-grin-squint: \f585; -$la-grin-squint-tears: \f586; -$la-grin-stars: \f587; -$la-grin-tears: \f588; -$la-grin-tongue: \f589; -$la-grin-tongue-squint: \f58a; -$la-grin-tongue-wink: \f58b; -$la-grin-wink: \f58c; -$la-grip-horizontal: \f58d; -$la-grip-lines: \f7a4; -$la-grip-lines-vertical: \f7a5; -$la-grip-vertical: \f58e; -$la-gripfire: \f3ac; -$la-grunt: \f3ad; -$la-guitar: \f7a6; -$la-gulp: \f3ae; -$la-h-square: \f0fd; -$la-hacker-news: \f1d4; -$la-hacker-news-square: \f3af; -$la-hackerrank: \f5f7; -$la-hamburger: \f805; -$la-hammer: \f6e3; -$la-hamsa: \f665; -$la-hand-holding: \f4bd; -$la-hand-holding-heart: \f4be; -$la-hand-holding-usd: \f4c0; -$la-hand-lizard: \f258; -$la-hand-middle-finger: \f806; -$la-hand-paper: \f256; -$la-hand-peace: \f25b; -$la-hand-point-down: \f0a7; -$la-hand-point-left: \f0a5; -$la-hand-point-right: \f0a4; -$la-hand-point-up: \f0a6; -$la-hand-pointer: \f25a; -$la-hand-rock: \f255; -$la-hand-scissors: \f257; -$la-hand-spock: \f259; -$la-hands: \f4c2; -$la-hands-helping: \f4c4; -$la-handshake: \f2b5; -$la-hanukiah: \f6e6; -$la-hard-hat: \f807; -$la-hashtag: \f292; -$la-hat-wizard: \f6e8; -$la-haykal: \f666; -$la-hdd: \f0a0; -$la-heading: \f1dc; -$la-headphones: \f025; -$la-headphones-alt: \f58f; -$la-headset: \f590; -$la-heart: \f004; -$la-heart-broken: \f7a9; -$la-heartbeat: \f21e; -$la-helicopter: \f533; -$la-highlighter: \f591; -$la-hiking: \f6ec; -$la-hippo: \f6ed; -$la-hips: \f452; -$la-hire-a-helper: \f3b0; -$la-history: \f1da; -$la-hockey-puck: \f453; -$la-holly-berry: \f7aa; -$la-home: \f015; -$la-hooli: \f427; -$la-hornbill: \f592; -$la-horse: \f6f0; -$la-horse-head: \f7ab; -$la-hospital: \f0f8; -$la-hospital-alt: \f47d; -$la-hospital-symbol: \f47e; -$la-hot-tub: \f593; -$la-hotdog: \f80f; -$la-hotel: \f594; -$la-hotjar: \f3b1; -$la-hourglass: \f254; -$la-hourglass-end: \f253; -$la-hourglass-half: \f252; -$la-hourglass-start: \f251; -$la-house-damage: \f6f1; -$la-houzz: \f27c; -$la-hryvnia: \f6f2; -$la-html5: \f13b; -$la-hubspot: \f3b2; -$la-i-cursor: \f246; -$la-ice-cream: \f810; -$la-icicles: \f7ad; -$la-icons: \f86d; -$la-id-badge: \f2c1; -$la-id-card: \f2c2; -$la-id-card-alt: \f47f; -$la-igloo: \f7ae; -$la-image: \f03e; -$la-images: \f302; -$la-imdb: \f2d8; -$la-inbox: \f01c; -$la-indent: \f03c; -$la-industry: \f275; -$la-infinity: \f534; -$la-info: \f129; -$la-info-circle: \f05a; -$la-instagram: \f16d; -$la-intercom: \f7af; -$la-internet-explorer: \f26b; -$la-invision: \f7b0; -$la-ioxhost: \f208; -$la-italic: \f033; -$la-itch-io: \f83a; -$la-itunes: \f3b4; -$la-itunes-note: \f3b5; -$la-java: \f4e4; -$la-jedi: \f669; -$la-jedi-order: \f50e; -$la-jenkins: \f3b6; -$la-jira: \f7b1; -$la-joget: \f3b7; -$la-joint: \f595; -$la-joomla: \f1aa; -$la-journal-whills: \f66a; -$la-js: \f3b8; -$la-js-square: \f3b9; -$la-jsfiddle: \f1cc; -$la-kaaba: \f66b; -$la-kaggle: \f5fa; -$la-key: \f084; -$la-keybase: \f4f5; -$la-keyboard: \f11c; -$la-keycdn: \f3ba; -$la-khanda: \f66d; -$la-kickstarter: \f3bb; -$la-kickstarter-k: \f3bc; -$la-kiss: \f596; -$la-kiss-beam: \f597; -$la-kiss-wink-heart: \f598; -$la-kiwi-bird: \f535; -$la-korvue: \f42f; -$la-landmark: \f66f; -$la-language: \f1ab; -$la-laptop: \f109; -$la-laptop-code: \f5fc; -$la-laptop-medical: \f812; -$la-laravel: \f3bd; -$la-lastfm: \f202; -$la-lastfm-square: \f203; -$la-laugh: \f599; -$la-laugh-beam: \f59a; -$la-laugh-squint: \f59b; -$la-laugh-wink: \f59c; -$la-layer-group: \f5fd; -$la-leaf: \f06c; -$la-leanpub: \f212; -$la-lemon: \f094; -$la-less: \f41d; -$la-less-than: \f536; -$la-less-than-equal: \f537; -$la-level-down-alt: \f3be; -$la-level-up-alt: \f3bf; -$la-life-ring: \f1cd; -$la-lightbulb: \f0eb; -$la-line: \f3c0; -$la-link: \f0c1; -$la-linkedin: \f08c; -$la-linkedin-in: \f0e1; -$la-linode: \f2b8; -$la-linux: \f17c; -$la-lira-sign: \f195; -$la-list: \f03a; -$la-list-alt: \f022; -$la-list-ol: \f0cb; -$la-list-ul: \f0ca; -$la-location-arrow: \f124; -$la-lock: \f023; -$la-lock-open: \f3c1; -$la-long-arrow-alt-down: \f309; -$la-long-arrow-alt-left: \f30a; -$la-long-arrow-alt-right: \f30b; -$la-long-arrow-alt-up: \f30c; -$la-low-vision: \f2a8; -$la-luggage-cart: \f59d; -$la-lyft: \f3c3; -$la-magento: \f3c4; -$la-magic: \f0d0; -$la-magnet: \f076; -$la-mail-bulk: \f674; -$la-mailchimp: \f59e; -$la-male: \f183; -$la-mandalorian: \f50f; -$la-map: \f279; -$la-map-marked: \f59f; -$la-map-marked-alt: \f5a0; -$la-map-marker: \f041; -$la-map-marker-alt: \f3c5; -$la-map-pin: \f276; -$la-map-signs: \f277; -$la-markdown: \f60f; -$la-marker: \f5a1; -$la-mars: \f222; -$la-mars-double: \f227; -$la-mars-stroke: \f229; -$la-mars-stroke-h: \f22b; -$la-mars-stroke-v: \f22a; -$la-mask: \f6fa; -$la-mastodon: \f4f6; -$la-maxcdn: \f136; -$la-medal: \f5a2; -$la-medapps: \f3c6; -$la-medium: \f23a; -$la-medium-m: \f3c7; -$la-medkit: \f0fa; -$la-medrt: \f3c8; -$la-meetup: \f2e0; -$la-megaport: \f5a3; -$la-meh: \f11a; -$la-meh-blank: \f5a4; -$la-meh-rolling-eyes: \f5a5; -$la-memory: \f538; -$la-mendeley: \f7b3; -$la-menorah: \f676; -$la-mercury: \f223; -$la-meteor: \f753; -$la-microchip: \f2db; -$la-microphone: \f130; -$la-microphone-alt: \f3c9; -$la-microphone-alt-slash: \f539; -$la-microphone-slash: \f131; -$la-microscope: \f610; -$la-microsoft: \f3ca; -$la-minus: \f068; -$la-minus-circle: \f056; -$la-minus-square: \f146; -$la-mitten: \f7b5; -$la-mix: \f3cb; -$la-mixcloud: \f289; -$la-mizuni: \f3cc; -$la-mobile: \f10b; -$la-mobile-alt: \f3cd; -$la-modx: \f285; -$la-monero: \f3d0; -$la-money-bill: \f0d6; -$la-money-bill-alt: \f3d1; -$la-money-bill-wave: \f53a; -$la-money-bill-wave-alt: \f53b; -$la-money-check: \f53c; -$la-money-check-alt: \f53d; -$la-monument: \f5a6; -$la-moon: \f186; -$la-mortar-pestle: \f5a7; -$la-mosque: \f678; -$la-motorcycle: \f21c; -$la-mountain: \f6fc; -$la-mouse-pointer: \f245; -$la-mug-hot: \f7b6; -$la-music: \f001; -$la-napster: \f3d2; -$la-neos: \f612; -$la-network-wired: \f6ff; -$la-neuter: \f22c; -$la-newspaper: \f1ea; -$la-nimblr: \f5a8; -$la-node: \f419; -$la-node-js: \f3d3; -$la-not-equal: \f53e; -$la-notes-medical: \f481; -$la-npm: \f3d4; -$la-ns8: \f3d5; -$la-nutritionix: \f3d6; -$la-object-group: \f247; -$la-object-ungroup: \f248; -$la-odnoklassniki: \f263; -$la-odnoklassniki-square: \f264; -$la-oil-can: \f613; -$la-old-republic: \f510; -$la-om: \f679; -$la-opencart: \f23d; -$la-openid: \f19b; -$la-opera: \f26a; -$la-optin-monster: \f23c; -$la-osi: \f41a; -$la-otter: \f700; -$la-outdent: \f03b; -$la-page4: \f3d7; -$la-pagelines: \f18c; -$la-pager: \f815; -$la-paint-brush: \f1fc; -$la-paint-roller: \f5aa; -$la-palette: \f53f; -$la-palfed: \f3d8; -$la-pallet: \f482; -$la-paper-plane: \f1d8; -$la-paperclip: \f0c6; -$la-parachute-box: \f4cd; -$la-paragraph: \f1dd; -$la-parking: \f540; -$la-passport: \f5ab; -$la-pastafarianism: \f67b; -$la-paste: \f0ea; -$la-patreon: \f3d9; -$la-pause: \f04c; -$la-pause-circle: \f28b; -$la-paw: \f1b0; -$la-paypal: \f1ed; -$la-peace: \f67c; -$la-pen: \f304; -$la-pen-alt: \f305; -$la-pen-fancy: \f5ac; -$la-pen-nib: \f5ad; -$la-pen-square: \f14b; -$la-pencil-alt: \f303; -$la-pencil-ruler: \f5ae; -$la-penny-arcade: \f704; -$la-people-carry: \f4ce; -$la-pepper-hot: \f816; -$la-percent: \f295; -$la-percentage: \f541; -$la-periscope: \f3da; -$la-person-booth: \f756; -$la-phabricator: \f3db; -$la-phoenix-framework: \f3dc; -$la-phoenix-squadron: \f511; -$la-phone: \f095; -$la-phone-alt: \f879; -$la-phone-slash: \f3dd; -$la-phone-square: \f098; -$la-phone-square-alt: \f87b; -$la-phone-volume: \f2a0; -$la-photo-video: \f87c; -$la-php: \f457; -$la-pied-piper: \f2ae; -$la-pied-piper-alt: \f1a8; -$la-pied-piper-hat: \f4e5; -$la-pied-piper-pp: \f1a7; -$la-piggy-bank: \f4d3; -$la-pills: \f484; -$la-pinterest: \f0d2; -$la-pinterest-p: \f231; -$la-pinterest-square: \f0d3; -$la-pizza-slice: \f818; -$la-place-of-worship: \f67f; -$la-plane: \f072; -$la-plane-arrival: \f5af; -$la-plane-departure: \f5b0; -$la-play: \f04b; -$la-play-circle: \f144; -$la-playstation: \f3df; -$la-plug: \f1e6; -$la-plus: \f067; -$la-plus-circle: \f055; -$la-plus-square: \f0fe; -$la-podcast: \f2ce; -$la-poll: \f681; -$la-poll-h: \f682; -$la-poo: \f2fe; -$la-poo-storm: \f75a; -$la-poop: \f619; -$la-portrait: \f3e0; -$la-pound-sign: \f154; -$la-power-off: \f011; -$la-pray: \f683; -$la-praying-hands: \f684; -$la-prescription: \f5b1; -$la-prescription-bottle: \f485; -$la-prescription-bottle-alt: \f486; -$la-print: \f02f; -$la-procedures: \f487; -$la-product-hunt: \f288; -$la-project-diagram: \f542; -$la-pushed: \f3e1; -$la-puzzle-piece: \f12e; -$la-python: \f3e2; -$la-qq: \f1d6; -$la-qrcode: \f029; -$la-question: \f128; -$la-question-circle: \f059; -$la-quidditch: \f458; -$la-quinscape: \f459; -$la-quora: \f2c4; -$la-quote-left: \f10d; -$la-quote-right: \f10e; -$la-quran: \f687; -$la-r-project: \f4f7; -$la-radiation: \f7b9; -$la-radiation-alt: \f7ba; -$la-rainbow: \f75b; -$la-random: \f074; -$la-raspberry-pi: \f7bb; -$la-ravelry: \f2d9; -$la-react: \f41b; -$la-reacteurope: \f75d; -$la-readme: \f4d5; -$la-rebel: \f1d0; -$la-receipt: \f543; -$la-recycle: \f1b8; -$la-red-river: \f3e3; -$la-reddit: \f1a1; -$la-reddit-alien: \f281; -$la-reddit-square: \f1a2; -$la-redhat: \f7bc; -$la-redo: \f01e; -$la-redo-alt: \f2f9; -$la-registered: \f25d; -$la-remove-format: \f87d; -$la-renren: \f18b; -$la-reply: \f3e5; -$la-reply-all: \f122; -$la-replyd: \f3e6; -$la-republican: \f75e; -$la-researchgate: \f4f8; -$la-resolving: \f3e7; -$la-restroom: \f7bd; -$la-retweet: \f079; -$la-rev: \f5b2; -$la-ribbon: \f4d6; -$la-ring: \f70b; -$la-road: \f018; -$la-robot: \f544; -$la-rocket: \f135; -$la-rocketchat: \f3e8; -$la-rockrms: \f3e9; -$la-route: \f4d7; -$la-rss: \f09e; -$la-rss-square: \f143; -$la-ruble-sign: \f158; -$la-ruler: \f545; -$la-ruler-combined: \f546; -$la-ruler-horizontal: \f547; -$la-ruler-vertical: \f548; -$la-running: \f70c; -$la-rupee-sign: \f156; -$la-sad-cry: \f5b3; -$la-sad-tear: \f5b4; -$la-safari: \f267; -$la-salesforce: \f83b; -$la-sass: \f41e; -$la-satellite: \f7bf; -$la-satellite-dish: \f7c0; -$la-save: \f0c7; -$la-schlix: \f3ea; -$la-school: \f549; -$la-screwdriver: \f54a; -$la-scribd: \f28a; -$la-scroll: \f70e; -$la-sd-card: \f7c2; -$la-search: \f002; -$la-search-dollar: \f688; -$la-search-location: \f689; -$la-search-minus: \f010; -$la-search-plus: \f00e; -$la-searchengin: \f3eb; -$la-seedling: \f4d8; -$la-sellcast: \f2da; -$la-sellsy: \f213; -$la-server: \f233; -$la-servicestack: \f3ec; -$la-shapes: \f61f; -$la-share: \f064; -$la-share-alt: \f1e0; -$la-share-alt-square: \f1e1; -$la-share-square: \f14d; -$la-shekel-sign: \f20b; -$la-shield-alt: \f3ed; -$la-ship: \f21a; -$la-shipping-fast: \f48b; -$la-shirtsinbulk: \f214; -$la-shoe-prints: \f54b; -$la-shopping-bag: \f290; -$la-shopping-basket: \f291; -$la-shopping-cart: \f07a; -$la-shopware: \f5b5; -$la-shower: \f2cc; -$la-shuttle-van: \f5b6; -$la-sign: \f4d9; -$la-sign-in-alt: \f2f6; -$la-sign-language: \f2a7; -$la-sign-out-alt: \f2f5; -$la-signal: \f012; -$la-signature: \f5b7; -$la-sim-card: \f7c4; -$la-simplybuilt: \f215; -$la-sistrix: \f3ee; -$la-sitemap: \f0e8; -$la-sith: \f512; -$la-skating: \f7c5; -$la-sketch: \f7c6; -$la-skiing: \f7c9; -$la-skiing-nordic: \f7ca; -$la-skull: \f54c; -$la-skull-crossbones: \f714; -$la-skyatlas: \f216; -$la-skype: \f17e; -$la-slack: \f198; -$la-slack-hash: \f3ef; -$la-slash: \f715; -$la-sleigh: \f7cc; -$la-sliders-h: \f1de; -$la-slideshare: \f1e7; -$la-smile: \f118; -$la-smile-beam: \f5b8; -$la-smile-wink: \f4da; -$la-smog: \f75f; -$la-smoking: \f48d; -$la-smoking-ban: \f54d; -$la-sms: \f7cd; -$la-snapchat: \f2ab; -$la-snapchat-ghost: \f2ac; -$la-snapchat-square: \f2ad; -$la-snowboarding: \f7ce; -$la-snowflake: \f2dc; -$la-snowman: \f7d0; -$la-snowplow: \f7d2; -$la-socks: \f696; -$la-solar-panel: \f5ba; -$la-sort: \f0dc; -$la-sort-alpha-down: \f15d; -$la-sort-alpha-down-alt: \f881; -$la-sort-alpha-up: \f15e; -$la-sort-alpha-up-alt: \f882; -$la-sort-amount-down: \f160; -$la-sort-amount-down-alt: \f884; -$la-sort-amount-up: \f161; -$la-sort-amount-up-alt: \f885; -$la-sort-down: \f0dd; -$la-sort-numeric-down: \f162; -$la-sort-numeric-down-alt: \f886; -$la-sort-numeric-up: \f163; -$la-sort-numeric-up-alt: \f887; -$la-sort-up: \f0de; -$la-soundcloud: \f1be; -$la-sourcetree: \f7d3; -$la-spa: \f5bb; -$la-space-shuttle: \f197; -$la-speakap: \f3f3; -$la-speaker-deck: \f83c; -$la-spell-check: \f891; -$la-spider: \f717; -$la-spinner: \f110; -$la-splotch: \f5bc; -$la-spotify: \f1bc; -$la-spray-can: \f5bd; -$la-square: \f0c8; -$la-square-full: \f45c; -$la-square-root-alt: \f698; -$la-squarespace: \f5be; -$la-stack-exchange: \f18d; -$la-stack-overflow: \f16c; -$la-stackpath: \f842; -$la-stamp: \f5bf; -$la-star: \f005; -$la-star-and-crescent: \f699; -$la-star-half: \f089; -$la-star-half-alt: \f5c0; -$la-star-of-david: \f69a; -$la-star-of-life: \f621; -$la-staylinked: \f3f5; -$la-steam: \f1b6; -$la-steam-square: \f1b7; -$la-steam-symbol: \f3f6; -$la-step-backward: \f048; -$la-step-forward: \f051; -$la-stethoscope: \f0f1; -$la-sticker-mule: \f3f7; -$la-sticky-note: \f249; -$la-stop: \f04d; -$la-stop-circle: \f28d; -$la-stopwatch: \f2f2; -$la-store: \f54e; -$la-store-alt: \f54f; -$la-strava: \f428; -$la-stream: \f550; -$la-street-view: \f21d; -$la-strikethrough: \f0cc; -$la-stripe: \f429; -$la-stripe-s: \f42a; -$la-stroopwafel: \f551; -$la-studiovinari: \f3f8; -$la-stumbleupon: \f1a4; -$la-stumbleupon-circle: \f1a3; -$la-subscript: \f12c; -$la-subway: \f239; -$la-suitcase: \f0f2; -$la-suitcase-rolling: \f5c1; -$la-sun: \f185; -$la-superpowers: \f2dd; -$la-superscript: \f12b; -$la-supple: \f3f9; -$la-surprise: \f5c2; -$la-suse: \f7d6; -$la-swatchbook: \f5c3; -$la-swimmer: \f5c4; -$la-swimming-pool: \f5c5; -$la-symfony: \f83d; -$la-synagogue: \f69b; -$la-sync: \f021; -$la-sync-alt: \f2f1; -$la-syringe: \f48e; -$la-table: \f0ce; -$la-table-tennis: \f45d; -$la-tablet: \f10a; -$la-tablet-alt: \f3fa; -$la-tablets: \f490; -$la-tachometer-alt: \f3fd; -$la-tag: \f02b; -$la-tags: \f02c; -$la-tape: \f4db; -$la-tasks: \f0ae; -$la-taxi: \f1ba; -$la-teamspeak: \f4f9; -$la-teeth: \f62e; -$la-teeth-open: \f62f; -$la-telegram: \f2c6; -$la-telegram-plane: \f3fe; -$la-temperature-high: \f769; -$la-temperature-low: \f76b; -$la-tencent-weibo: \f1d5; -$la-tenge: \f7d7; -$la-terminal: \f120; -$la-text-height: \f034; -$la-text-width: \f035; -$la-th: \f00a; -$la-th-large: \f009; -$la-th-list: \f00b; -$la-the-red-yeti: \f69d; -$la-theater-masks: \f630; -$la-themeco: \f5c6; -$la-themeisle: \f2b2; -$la-thermometer: \f491; -$la-thermometer-empty: \f2cb; -$la-thermometer-full: \f2c7; -$la-thermometer-half: \f2c9; -$la-thermometer-quarter: \f2ca; -$la-thermometer-three-quarters: \f2c8; -$la-think-peaks: \f731; -$la-thumbs-down: \f165; -$la-thumbs-up: \f164; -$la-thumbtack: \f08d; -$la-ticket-alt: \f3ff; -$la-times: \f00d; -$la-times-circle: \f057; -$la-tint: \f043; -$la-tint-slash: \f5c7; -$la-tired: \f5c8; -$la-toggle-off: \f204; -$la-toggle-on: \f205; -$la-toilet: \f7d8; -$la-toilet-paper: \f71e; -$la-toolbox: \f552; -$la-tools: \f7d9; -$la-tooth: \f5c9; -$la-torah: \f6a0; -$la-torii-gate: \f6a1; -$la-tractor: \f722; -$la-trade-federation: \f513; -$la-trademark: \f25c; -$la-traffic-light: \f637; -$la-train: \f238; -$la-tram: \f7da; -$la-transgender: \f224; -$la-transgender-alt: \f225; -$la-trash: \f1f8; -$la-trash-alt: \f2ed; -$la-trash-restore: \f829; -$la-trash-restore-alt: \f82a; -$la-tree: \f1bb; -$la-trello: \f181; -$la-tripadvisor: \f262; -$la-trophy: \f091; -$la-truck: \f0d1; -$la-truck-loading: \f4de; -$la-truck-monster: \f63b; -$la-truck-moving: \f4df; -$la-truck-pickup: \f63c; -$la-tshirt: \f553; -$la-tty: \f1e4; -$la-tumblr: \f173; -$la-tumblr-square: \f174; -$la-tv: \f26c; -$la-twitch: \f1e8; -$la-twitter: \f099; -$la-twitter-square: \f081; -$la-typo3: \f42b; -$la-uber: \f402; -$la-ubuntu: \f7df; -$la-uikit: \f403; -$la-umbrella: \f0e9; -$la-umbrella-beach: \f5ca; -$la-underline: \f0cd; -$la-undo: \f0e2; -$la-undo-alt: \f2ea; -$la-uniregistry: \f404; -$la-universal-access: \f29a; -$la-university: \f19c; -$la-unlink: \f127; -$la-unlock: \f09c; -$la-unlock-alt: \f13e; -$la-untappd: \f405; -$la-upload: \f093; -$la-ups: \f7e0; -$la-usb: \f287; -$la-user: \f007; -$la-user-alt: \f406; -$la-user-alt-slash: \f4fa; -$la-user-astronaut: \f4fb; -$la-user-check: \f4fc; -$la-user-circle: \f2bd; -$la-user-clock: \f4fd; -$la-user-cog: \f4fe; -$la-user-edit: \f4ff; -$la-user-friends: \f500; -$la-user-graduate: \f501; -$la-user-injured: \f728; -$la-user-lock: \f502; -$la-user-md: \f0f0; -$la-user-minus: \f503; -$la-user-ninja: \f504; -$la-user-nurse: \f82f; -$la-user-plus: \f234; -$la-user-secret: \f21b; -$la-user-shield: \f505; -$la-user-slash: \f506; -$la-user-tag: \f507; -$la-user-tie: \f508; -$la-user-times: \f235; -$la-users: \f0c0; -$la-users-cog: \f509; -$la-usps: \f7e1; -$la-ussunnah: \f407; -$la-utensil-spoon: \f2e5; -$la-utensils: \f2e7; -$la-vaadin: \f408; -$la-vector-square: \f5cb; -$la-venus: \f221; -$la-venus-double: \f226; -$la-venus-mars: \f228; -$la-viacoin: \f237; -$la-viadeo: \f2a9; -$la-viadeo-square: \f2aa; -$la-vial: \f492; -$la-vials: \f493; -$la-viber: \f409; -$la-video: \f03d; -$la-video-slash: \f4e2; -$la-vihara: \f6a7; -$la-vimeo: \f40a; -$la-vimeo-square: \f194; -$la-vimeo-v: \f27d; -$la-vine: \f1ca; -$la-vk: \f189; -$la-vnv: \f40b; -$la-voicemail: \f897; -$la-volleyball-ball: \f45f; -$la-volume-down: \f027; -$la-volume-mute: \f6a9; -$la-volume-off: \f026; -$la-volume-up: \f028; -$la-vote-yea: \f772; -$la-vr-cardboard: \f729; -$la-vuejs: \f41f; -$la-walking: \f554; -$la-wallet: \f555; -$la-warehouse: \f494; -$la-water: \f773; -$la-wave-square: \f83e; -$la-waze: \f83f; -$la-weebly: \f5cc; -$la-weibo: \f18a; -$la-weight: \f496; -$la-weight-hanging: \f5cd; -$la-weixin: \f1d7; -$la-whatsapp: \f232; -$la-whatsapp-square: \f40c; -$la-wheelchair: \f193; -$la-whmcs: \f40d; -$la-wifi: \f1eb; -$la-wikipedia-w: \f266; -$la-wind: \f72e; -$la-window-close: \f410; -$la-window-maximize: \f2d0; -$la-window-minimize: \f2d1; -$la-window-restore: \f2d2; -$la-windows: \f17a; -$la-wine-bottle: \f72f; -$la-wine-glass: \f4e3; -$la-wine-glass-alt: \f5ce; -$la-wix: \f5cf; -$la-wizards-of-the-coast: \f730; -$la-wolf-pack-battalion: \f514; -$la-won-sign: \f159; -$la-wordpress: \f19a; -$la-wordpress-simple: \f411; -$la-wpbeginner: \f297; -$la-wpexplorer: \f2de; -$la-wpforms: \f298; -$la-wpressr: \f3e4; -$la-wrench: \f0ad; -$la-x-ray: \f497; -$la-xbox: \f412; -$la-xing: \f168; -$la-xing-square: \f169; -$la-y-combinator: \f23b; -$la-yahoo: \f19e; -$la-yammer: \f840; -$la-yandex: \f413; -$la-yandex-international: \f414; -$la-yarn: \f7e3; -$la-yelp: \f1e9; -$la-yen-sign: \f157; -$la-yin-yang: \f6ad; -$la-yoast: \f2b1; -$la-youtube: \f167; -$la-youtube-square: \f431; -$la-zhihu: \f63f; -$la-hat-cowboy: \f8c0; -$la-hat-cowboy-side: \f8c1; -$la-mdb: \f8ca; -$la-mouse: \f8cc; -$la-orcid: \f8d2; -$la-record-vinyl: \f8d9; -$la-swift: \f8e1; -$la-umbraco: \f8e8; -$la-buy-n-large: \f8a6; diff --git a/python/static/scss/line-awesome.scss b/python/static/scss/line-awesome.scss deleted file mode 100644 index 1a9f614..0000000 --- a/python/static/scss/line-awesome.scss +++ /dev/null @@ -1,12 +0,0 @@ -@import "mixins"; -@import "core"; -@import "variables"; -@import "path"; -@import "larger"; -@import "fixed-width"; -@import "list"; -@import "bordered_pulled"; -@import "rotated-flipped"; -@import "stacked"; -@import "icons"; -@import "screen-reader"; diff --git a/python/static/svg/500px.svg b/python/static/svg/500px.svg deleted file mode 100755 index 51cf807..0000000 --- a/python/static/svg/500px.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/accessible-icon.svg b/python/static/svg/accessible-icon.svg deleted file mode 100755 index 4578aeb..0000000 --- a/python/static/svg/accessible-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/accusoft.svg b/python/static/svg/accusoft.svg deleted file mode 100755 index 863fa89..0000000 --- a/python/static/svg/accusoft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/acquisitions-incorporated.svg b/python/static/svg/acquisitions-incorporated.svg deleted file mode 100755 index e82a5be..0000000 --- a/python/static/svg/acquisitions-incorporated.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ad-solid.svg b/python/static/svg/ad-solid.svg deleted file mode 100755 index ee85768..0000000 --- a/python/static/svg/ad-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/address-book-solid.svg b/python/static/svg/address-book-solid.svg deleted file mode 100755 index 4d08ca8..0000000 --- a/python/static/svg/address-book-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/address-book.svg b/python/static/svg/address-book.svg deleted file mode 100755 index 4d08ca8..0000000 --- a/python/static/svg/address-book.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/address-card-solid.svg b/python/static/svg/address-card-solid.svg deleted file mode 100755 index fcd8461..0000000 --- a/python/static/svg/address-card-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/address-card.svg b/python/static/svg/address-card.svg deleted file mode 100755 index fcd8461..0000000 --- a/python/static/svg/address-card.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/adjust-solid.svg b/python/static/svg/adjust-solid.svg deleted file mode 100755 index 775aaec..0000000 --- a/python/static/svg/adjust-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/adn.svg b/python/static/svg/adn.svg deleted file mode 100755 index 2391da5..0000000 --- a/python/static/svg/adn.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/adobe.svg b/python/static/svg/adobe.svg deleted file mode 100755 index b8bb0f9..0000000 --- a/python/static/svg/adobe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/adversal.svg b/python/static/svg/adversal.svg deleted file mode 100755 index 46a982f..0000000 --- a/python/static/svg/adversal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/affiliatetheme.svg b/python/static/svg/affiliatetheme.svg deleted file mode 100755 index 3e0c14c..0000000 --- a/python/static/svg/affiliatetheme.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/air-freshener-solid.svg b/python/static/svg/air-freshener-solid.svg deleted file mode 100755 index 8881d8e..0000000 --- a/python/static/svg/air-freshener-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/airbnb.svg b/python/static/svg/airbnb.svg deleted file mode 100755 index afe69d3..0000000 --- a/python/static/svg/airbnb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/algolia.svg b/python/static/svg/algolia.svg deleted file mode 100755 index 6aae6c2..0000000 --- a/python/static/svg/algolia.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/align-center-solid.svg b/python/static/svg/align-center-solid.svg deleted file mode 100755 index cbb7404..0000000 --- a/python/static/svg/align-center-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/align-justify-solid.svg b/python/static/svg/align-justify-solid.svg deleted file mode 100755 index 72e9f95..0000000 --- a/python/static/svg/align-justify-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/align-left-solid.svg b/python/static/svg/align-left-solid.svg deleted file mode 100755 index aec99b3..0000000 --- a/python/static/svg/align-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/align-right-solid.svg b/python/static/svg/align-right-solid.svg deleted file mode 100755 index 080eb04..0000000 --- a/python/static/svg/align-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/alipay.svg b/python/static/svg/alipay.svg deleted file mode 100755 index ef0adeb..0000000 --- a/python/static/svg/alipay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/allergies-solid.svg b/python/static/svg/allergies-solid.svg deleted file mode 100755 index 2acc01d..0000000 --- a/python/static/svg/allergies-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/amazon-pay.svg b/python/static/svg/amazon-pay.svg deleted file mode 100755 index 4b0d89c..0000000 --- a/python/static/svg/amazon-pay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/amazon.svg b/python/static/svg/amazon.svg deleted file mode 100755 index 927aadc..0000000 --- a/python/static/svg/amazon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ambulance-solid.svg b/python/static/svg/ambulance-solid.svg deleted file mode 100755 index ec644f9..0000000 --- a/python/static/svg/ambulance-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/american-sign-language-interpreting-solid.svg b/python/static/svg/american-sign-language-interpreting-solid.svg deleted file mode 100755 index f324a4b..0000000 --- a/python/static/svg/american-sign-language-interpreting-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/amilia.svg b/python/static/svg/amilia.svg deleted file mode 100755 index f71eb68..0000000 --- a/python/static/svg/amilia.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/anchor-solid.svg b/python/static/svg/anchor-solid.svg deleted file mode 100755 index e41f008..0000000 --- a/python/static/svg/anchor-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/android.svg b/python/static/svg/android.svg deleted file mode 100755 index 390ee99..0000000 --- a/python/static/svg/android.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angellist.svg b/python/static/svg/angellist.svg deleted file mode 100755 index b498264..0000000 --- a/python/static/svg/angellist.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-double-down-solid.svg b/python/static/svg/angle-double-down-solid.svg deleted file mode 100755 index 3383285..0000000 --- a/python/static/svg/angle-double-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-double-left-solid.svg b/python/static/svg/angle-double-left-solid.svg deleted file mode 100755 index e3fd0eb..0000000 --- a/python/static/svg/angle-double-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-double-right-solid.svg b/python/static/svg/angle-double-right-solid.svg deleted file mode 100755 index fcc9736..0000000 --- a/python/static/svg/angle-double-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-double-up-solid.svg b/python/static/svg/angle-double-up-solid.svg deleted file mode 100755 index afde69f..0000000 --- a/python/static/svg/angle-double-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-down-solid.svg b/python/static/svg/angle-down-solid.svg deleted file mode 100755 index db8b04d..0000000 --- a/python/static/svg/angle-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-left-solid.svg b/python/static/svg/angle-left-solid.svg deleted file mode 100755 index 67bad04..0000000 --- a/python/static/svg/angle-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-right-solid.svg b/python/static/svg/angle-right-solid.svg deleted file mode 100755 index 2e6375f..0000000 --- a/python/static/svg/angle-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angle-up-solid.svg b/python/static/svg/angle-up-solid.svg deleted file mode 100755 index 55d4d61..0000000 --- a/python/static/svg/angle-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angry-solid.svg b/python/static/svg/angry-solid.svg deleted file mode 100755 index 31d62dd..0000000 --- a/python/static/svg/angry-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angry.svg b/python/static/svg/angry.svg deleted file mode 100755 index 31d62dd..0000000 --- a/python/static/svg/angry.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angrycreative.svg b/python/static/svg/angrycreative.svg deleted file mode 100755 index 32a1188..0000000 --- a/python/static/svg/angrycreative.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/angular.svg b/python/static/svg/angular.svg deleted file mode 100755 index a569bef..0000000 --- a/python/static/svg/angular.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ankh-solid.svg b/python/static/svg/ankh-solid.svg deleted file mode 100755 index 42923e6..0000000 --- a/python/static/svg/ankh-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/app-store-ios.svg b/python/static/svg/app-store-ios.svg deleted file mode 100755 index 0f80b26..0000000 --- a/python/static/svg/app-store-ios.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/app-store.svg b/python/static/svg/app-store.svg deleted file mode 100755 index 1ae027d..0000000 --- a/python/static/svg/app-store.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/apper.svg b/python/static/svg/apper.svg deleted file mode 100755 index a56ce01..0000000 --- a/python/static/svg/apper.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/apple-alt-solid.svg b/python/static/svg/apple-alt-solid.svg deleted file mode 100755 index 62269db..0000000 --- a/python/static/svg/apple-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/apple-pay.svg b/python/static/svg/apple-pay.svg deleted file mode 100755 index 70b5eaf..0000000 --- a/python/static/svg/apple-pay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/apple.svg b/python/static/svg/apple.svg deleted file mode 100755 index a2a2ea8..0000000 --- a/python/static/svg/apple.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/archive-solid.svg b/python/static/svg/archive-solid.svg deleted file mode 100755 index 268cdd5..0000000 --- a/python/static/svg/archive-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/archway-solid.svg b/python/static/svg/archway-solid.svg deleted file mode 100755 index 3803928..0000000 --- a/python/static/svg/archway-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-down-solid.svg b/python/static/svg/arrow-alt-circle-down-solid.svg deleted file mode 100755 index 70a5332..0000000 --- a/python/static/svg/arrow-alt-circle-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-down.svg b/python/static/svg/arrow-alt-circle-down.svg deleted file mode 100755 index 70a5332..0000000 --- a/python/static/svg/arrow-alt-circle-down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-left-solid.svg b/python/static/svg/arrow-alt-circle-left-solid.svg deleted file mode 100755 index 5124e34..0000000 --- a/python/static/svg/arrow-alt-circle-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-left.svg b/python/static/svg/arrow-alt-circle-left.svg deleted file mode 100755 index 5124e34..0000000 --- a/python/static/svg/arrow-alt-circle-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-right-solid.svg b/python/static/svg/arrow-alt-circle-right-solid.svg deleted file mode 100755 index c71da46..0000000 --- a/python/static/svg/arrow-alt-circle-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-right.svg b/python/static/svg/arrow-alt-circle-right.svg deleted file mode 100755 index c71da46..0000000 --- a/python/static/svg/arrow-alt-circle-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-up-solid.svg b/python/static/svg/arrow-alt-circle-up-solid.svg deleted file mode 100755 index 08859b7..0000000 --- a/python/static/svg/arrow-alt-circle-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-alt-circle-up.svg b/python/static/svg/arrow-alt-circle-up.svg deleted file mode 100755 index 08859b7..0000000 --- a/python/static/svg/arrow-alt-circle-up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-circle-down-solid.svg b/python/static/svg/arrow-circle-down-solid.svg deleted file mode 100755 index 29b276e..0000000 --- a/python/static/svg/arrow-circle-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-circle-left-solid.svg b/python/static/svg/arrow-circle-left-solid.svg deleted file mode 100755 index c4f7299..0000000 --- a/python/static/svg/arrow-circle-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-circle-right-solid.svg b/python/static/svg/arrow-circle-right-solid.svg deleted file mode 100755 index c85651d..0000000 --- a/python/static/svg/arrow-circle-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-circle-up-solid.svg b/python/static/svg/arrow-circle-up-solid.svg deleted file mode 100755 index f90c5aa..0000000 --- a/python/static/svg/arrow-circle-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-down-solid.svg b/python/static/svg/arrow-down-solid.svg deleted file mode 100755 index 1589a3b..0000000 --- a/python/static/svg/arrow-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-left-solid.svg b/python/static/svg/arrow-left-solid.svg deleted file mode 100755 index c5c5987..0000000 --- a/python/static/svg/arrow-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-right-solid.svg b/python/static/svg/arrow-right-solid.svg deleted file mode 100755 index 442d9ef..0000000 --- a/python/static/svg/arrow-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrow-up-solid.svg b/python/static/svg/arrow-up-solid.svg deleted file mode 100755 index 0ba8a37..0000000 --- a/python/static/svg/arrow-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrows-alt-h-solid.svg b/python/static/svg/arrows-alt-h-solid.svg deleted file mode 100755 index 89dde99..0000000 --- a/python/static/svg/arrows-alt-h-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrows-alt-solid.svg b/python/static/svg/arrows-alt-solid.svg deleted file mode 100755 index b23b13f..0000000 --- a/python/static/svg/arrows-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/arrows-alt-v-solid.svg b/python/static/svg/arrows-alt-v-solid.svg deleted file mode 100755 index 8155025..0000000 --- a/python/static/svg/arrows-alt-v-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/artstation.svg b/python/static/svg/artstation.svg deleted file mode 100755 index dc2c404..0000000 --- a/python/static/svg/artstation.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/assistive-listening-systems-solid.svg b/python/static/svg/assistive-listening-systems-solid.svg deleted file mode 100755 index f27f68f..0000000 --- a/python/static/svg/assistive-listening-systems-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/asterisk-solid.svg b/python/static/svg/asterisk-solid.svg deleted file mode 100755 index 44c480b..0000000 --- a/python/static/svg/asterisk-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/asymmetrik.svg b/python/static/svg/asymmetrik.svg deleted file mode 100755 index be2e871..0000000 --- a/python/static/svg/asymmetrik.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/at-solid.svg b/python/static/svg/at-solid.svg deleted file mode 100755 index c9933bc..0000000 --- a/python/static/svg/at-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/atlas-solid.svg b/python/static/svg/atlas-solid.svg deleted file mode 100755 index 0fdce31..0000000 --- a/python/static/svg/atlas-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/atlassian.svg b/python/static/svg/atlassian.svg deleted file mode 100755 index 895859c..0000000 --- a/python/static/svg/atlassian.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/atom-solid.svg b/python/static/svg/atom-solid.svg deleted file mode 100755 index 32c9ba7..0000000 --- a/python/static/svg/atom-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/audible.svg b/python/static/svg/audible.svg deleted file mode 100755 index 45f9e15..0000000 --- a/python/static/svg/audible.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/audio-description-solid.svg b/python/static/svg/audio-description-solid.svg deleted file mode 100755 index 567f9ed..0000000 --- a/python/static/svg/audio-description-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/autoprefixer.svg b/python/static/svg/autoprefixer.svg deleted file mode 100755 index c34d544..0000000 --- a/python/static/svg/autoprefixer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/avianex.svg b/python/static/svg/avianex.svg deleted file mode 100755 index 786069e..0000000 --- a/python/static/svg/avianex.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/aviato.svg b/python/static/svg/aviato.svg deleted file mode 100755 index f19046f..0000000 --- a/python/static/svg/aviato.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/award-solid.svg b/python/static/svg/award-solid.svg deleted file mode 100755 index 8c583c6..0000000 --- a/python/static/svg/award-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/aws.svg b/python/static/svg/aws.svg deleted file mode 100755 index 34a1b57..0000000 --- a/python/static/svg/aws.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/baby-carriage-solid.svg b/python/static/svg/baby-carriage-solid.svg deleted file mode 100755 index 6fff5a9..0000000 --- a/python/static/svg/baby-carriage-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/baby-solid.svg b/python/static/svg/baby-solid.svg deleted file mode 100755 index 5cf6742..0000000 --- a/python/static/svg/baby-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/backspace-solid.svg b/python/static/svg/backspace-solid.svg deleted file mode 100755 index bb80969..0000000 --- a/python/static/svg/backspace-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/backward-solid.svg b/python/static/svg/backward-solid.svg deleted file mode 100755 index 83793b6..0000000 --- a/python/static/svg/backward-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bacon-solid.svg b/python/static/svg/bacon-solid.svg deleted file mode 100755 index 62c21ea..0000000 --- a/python/static/svg/bacon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/balance-scale-left-solid.svg b/python/static/svg/balance-scale-left-solid.svg deleted file mode 100755 index 4df54d4..0000000 --- a/python/static/svg/balance-scale-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/balance-scale-right-solid.svg b/python/static/svg/balance-scale-right-solid.svg deleted file mode 100755 index 1434990..0000000 --- a/python/static/svg/balance-scale-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/balance-scale-solid.svg b/python/static/svg/balance-scale-solid.svg deleted file mode 100755 index a133a33..0000000 --- a/python/static/svg/balance-scale-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ban-solid.svg b/python/static/svg/ban-solid.svg deleted file mode 100755 index 1bc0be3..0000000 --- a/python/static/svg/ban-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/band-aid-solid.svg b/python/static/svg/band-aid-solid.svg deleted file mode 100755 index bd20fca..0000000 --- a/python/static/svg/band-aid-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bandcamp.svg b/python/static/svg/bandcamp.svg deleted file mode 100755 index 39ecdcb..0000000 --- a/python/static/svg/bandcamp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/barcode-solid.svg b/python/static/svg/barcode-solid.svg deleted file mode 100755 index 8aaba13..0000000 --- a/python/static/svg/barcode-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bars-solid.svg b/python/static/svg/bars-solid.svg deleted file mode 100755 index 6eaad00..0000000 --- a/python/static/svg/bars-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/baseball-ball-solid.svg b/python/static/svg/baseball-ball-solid.svg deleted file mode 100755 index 55f950c..0000000 --- a/python/static/svg/baseball-ball-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/basketball-ball-solid.svg b/python/static/svg/basketball-ball-solid.svg deleted file mode 100755 index c9116e3..0000000 --- a/python/static/svg/basketball-ball-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bath-solid.svg b/python/static/svg/bath-solid.svg deleted file mode 100755 index 19f539b..0000000 --- a/python/static/svg/bath-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/battery-empty-solid.svg b/python/static/svg/battery-empty-solid.svg deleted file mode 100755 index 78fe2a7..0000000 --- a/python/static/svg/battery-empty-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/battery-full-solid.svg b/python/static/svg/battery-full-solid.svg deleted file mode 100755 index 56964e2..0000000 --- a/python/static/svg/battery-full-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/battery-half-solid.svg b/python/static/svg/battery-half-solid.svg deleted file mode 100755 index 6293aa5..0000000 --- a/python/static/svg/battery-half-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/battery-quarter-solid.svg b/python/static/svg/battery-quarter-solid.svg deleted file mode 100755 index 73ba9c1..0000000 --- a/python/static/svg/battery-quarter-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/battery-three-quarters-solid.svg b/python/static/svg/battery-three-quarters-solid.svg deleted file mode 100755 index 27426b2..0000000 --- a/python/static/svg/battery-three-quarters-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/battle-net.svg b/python/static/svg/battle-net.svg deleted file mode 100755 index 12ba37a..0000000 --- a/python/static/svg/battle-net.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bed-solid.svg b/python/static/svg/bed-solid.svg deleted file mode 100755 index febfccc..0000000 --- a/python/static/svg/bed-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/beer-solid.svg b/python/static/svg/beer-solid.svg deleted file mode 100755 index 7ad3d3f..0000000 --- a/python/static/svg/beer-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/behance-square.svg b/python/static/svg/behance-square.svg deleted file mode 100755 index 90023eb..0000000 --- a/python/static/svg/behance-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/behance.svg b/python/static/svg/behance.svg deleted file mode 100755 index dc6eeaa..0000000 --- a/python/static/svg/behance.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bell-slash-solid.svg b/python/static/svg/bell-slash-solid.svg deleted file mode 100755 index bc71078..0000000 --- a/python/static/svg/bell-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bell-slash.svg b/python/static/svg/bell-slash.svg deleted file mode 100755 index bc71078..0000000 --- a/python/static/svg/bell-slash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bell-solid.svg b/python/static/svg/bell-solid.svg deleted file mode 100755 index 036afd8..0000000 --- a/python/static/svg/bell-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bell.svg b/python/static/svg/bell.svg deleted file mode 100755 index 036afd8..0000000 --- a/python/static/svg/bell.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bezier-curve-solid.svg b/python/static/svg/bezier-curve-solid.svg deleted file mode 100755 index 54d4863..0000000 --- a/python/static/svg/bezier-curve-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bible-solid.svg b/python/static/svg/bible-solid.svg deleted file mode 100755 index 6aa6d54..0000000 --- a/python/static/svg/bible-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bicycle-solid.svg b/python/static/svg/bicycle-solid.svg deleted file mode 100755 index 8ce229a..0000000 --- a/python/static/svg/bicycle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/biking-solid.svg b/python/static/svg/biking-solid.svg deleted file mode 100755 index f4d9e81..0000000 --- a/python/static/svg/biking-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bimobject.svg b/python/static/svg/bimobject.svg deleted file mode 100755 index c8c8f32..0000000 --- a/python/static/svg/bimobject.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/binoculars-solid.svg b/python/static/svg/binoculars-solid.svg deleted file mode 100755 index 604165e..0000000 --- a/python/static/svg/binoculars-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/biohazard-solid.svg b/python/static/svg/biohazard-solid.svg deleted file mode 100755 index 3565f49..0000000 --- a/python/static/svg/biohazard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/birthday-cake-solid.svg b/python/static/svg/birthday-cake-solid.svg deleted file mode 100755 index 6168227..0000000 --- a/python/static/svg/birthday-cake-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bitbucket.svg b/python/static/svg/bitbucket.svg deleted file mode 100755 index aa901a0..0000000 --- a/python/static/svg/bitbucket.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bitcoin.svg b/python/static/svg/bitcoin.svg deleted file mode 100755 index e9d88ac..0000000 --- a/python/static/svg/bitcoin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bity.svg b/python/static/svg/bity.svg deleted file mode 100755 index af1ed09..0000000 --- a/python/static/svg/bity.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/black-tie.svg b/python/static/svg/black-tie.svg deleted file mode 100755 index 798236b..0000000 --- a/python/static/svg/black-tie.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/blackberry.svg b/python/static/svg/blackberry.svg deleted file mode 100755 index ddb768c..0000000 --- a/python/static/svg/blackberry.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/blender-phone-solid.svg b/python/static/svg/blender-phone-solid.svg deleted file mode 100755 index 0bbf92f..0000000 --- a/python/static/svg/blender-phone-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/blender-solid.svg b/python/static/svg/blender-solid.svg deleted file mode 100755 index 977e465..0000000 --- a/python/static/svg/blender-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/blind-solid.svg b/python/static/svg/blind-solid.svg deleted file mode 100755 index 01b5953..0000000 --- a/python/static/svg/blind-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/blog-solid.svg b/python/static/svg/blog-solid.svg deleted file mode 100755 index ccc0b3b..0000000 --- a/python/static/svg/blog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/blogger-b.svg b/python/static/svg/blogger-b.svg deleted file mode 100755 index f72a7e2..0000000 --- a/python/static/svg/blogger-b.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/blogger.svg b/python/static/svg/blogger.svg deleted file mode 100755 index c88c680..0000000 --- a/python/static/svg/blogger.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bluetooth-b.svg b/python/static/svg/bluetooth-b.svg deleted file mode 100755 index 6ff1b97..0000000 --- a/python/static/svg/bluetooth-b.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bluetooth.svg b/python/static/svg/bluetooth.svg deleted file mode 100755 index 5f82777..0000000 --- a/python/static/svg/bluetooth.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bold-solid.svg b/python/static/svg/bold-solid.svg deleted file mode 100755 index 53d68e3..0000000 --- a/python/static/svg/bold-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bolt-solid.svg b/python/static/svg/bolt-solid.svg deleted file mode 100755 index 5d38003..0000000 --- a/python/static/svg/bolt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bomb-solid.svg b/python/static/svg/bomb-solid.svg deleted file mode 100755 index 746364e..0000000 --- a/python/static/svg/bomb-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bone-solid.svg b/python/static/svg/bone-solid.svg deleted file mode 100755 index 4a776b2..0000000 --- a/python/static/svg/bone-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bong-solid.svg b/python/static/svg/bong-solid.svg deleted file mode 100755 index 2b28b93..0000000 --- a/python/static/svg/bong-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/book-dead-solid.svg b/python/static/svg/book-dead-solid.svg deleted file mode 100755 index 4d5daf7..0000000 --- a/python/static/svg/book-dead-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/book-medical-solid.svg b/python/static/svg/book-medical-solid.svg deleted file mode 100755 index 747231e..0000000 --- a/python/static/svg/book-medical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/book-open-solid.svg b/python/static/svg/book-open-solid.svg deleted file mode 100755 index 8c52eda..0000000 --- a/python/static/svg/book-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/book-reader-solid.svg b/python/static/svg/book-reader-solid.svg deleted file mode 100755 index 1591623..0000000 --- a/python/static/svg/book-reader-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/book-solid.svg b/python/static/svg/book-solid.svg deleted file mode 100755 index 0d0ad6a..0000000 --- a/python/static/svg/book-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bookmark-solid.svg b/python/static/svg/bookmark-solid.svg deleted file mode 100755 index 9068b01..0000000 --- a/python/static/svg/bookmark-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bookmark.svg b/python/static/svg/bookmark.svg deleted file mode 100755 index 9068b01..0000000 --- a/python/static/svg/bookmark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bootstrap.svg b/python/static/svg/bootstrap.svg deleted file mode 100755 index d4286b4..0000000 --- a/python/static/svg/bootstrap.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/border-all-solid.svg b/python/static/svg/border-all-solid.svg deleted file mode 100755 index 7536631..0000000 --- a/python/static/svg/border-all-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/border-none-solid.svg b/python/static/svg/border-none-solid.svg deleted file mode 100755 index 7a4a3ee..0000000 --- a/python/static/svg/border-none-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/border-style-solid.svg b/python/static/svg/border-style-solid.svg deleted file mode 100755 index fc32a4d..0000000 --- a/python/static/svg/border-style-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bowling-ball-solid.svg b/python/static/svg/bowling-ball-solid.svg deleted file mode 100755 index 655fa28..0000000 --- a/python/static/svg/bowling-ball-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/box-open-solid.svg b/python/static/svg/box-open-solid.svg deleted file mode 100755 index efc57fa..0000000 --- a/python/static/svg/box-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/box-solid.svg b/python/static/svg/box-solid.svg deleted file mode 100755 index ecedb76..0000000 --- a/python/static/svg/box-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/boxes-solid.svg b/python/static/svg/boxes-solid.svg deleted file mode 100755 index 7994d44..0000000 --- a/python/static/svg/boxes-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/braille-solid.svg b/python/static/svg/braille-solid.svg deleted file mode 100755 index 75dec35..0000000 --- a/python/static/svg/braille-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/brain-solid.svg b/python/static/svg/brain-solid.svg deleted file mode 100755 index d9df73d..0000000 --- a/python/static/svg/brain-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bread-slice-solid.svg b/python/static/svg/bread-slice-solid.svg deleted file mode 100755 index 0b3e953..0000000 --- a/python/static/svg/bread-slice-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/briefcase-medical-solid.svg b/python/static/svg/briefcase-medical-solid.svg deleted file mode 100755 index 000a5df..0000000 --- a/python/static/svg/briefcase-medical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/briefcase-solid.svg b/python/static/svg/briefcase-solid.svg deleted file mode 100755 index aa6061c..0000000 --- a/python/static/svg/briefcase-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/broadcast-tower-solid.svg b/python/static/svg/broadcast-tower-solid.svg deleted file mode 100755 index bc5344d..0000000 --- a/python/static/svg/broadcast-tower-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/broom-solid.svg b/python/static/svg/broom-solid.svg deleted file mode 100755 index 2c7302d..0000000 --- a/python/static/svg/broom-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/brush-solid.svg b/python/static/svg/brush-solid.svg deleted file mode 100755 index c2e21b8..0000000 --- a/python/static/svg/brush-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/btc.svg b/python/static/svg/btc.svg deleted file mode 100755 index e9d88ac..0000000 --- a/python/static/svg/btc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/buffer.svg b/python/static/svg/buffer.svg deleted file mode 100755 index 65ccbc2..0000000 --- a/python/static/svg/buffer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bug-solid.svg b/python/static/svg/bug-solid.svg deleted file mode 100755 index 9b536db..0000000 --- a/python/static/svg/bug-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/building-solid.svg b/python/static/svg/building-solid.svg deleted file mode 100755 index 3c423a9..0000000 --- a/python/static/svg/building-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/building.svg b/python/static/svg/building.svg deleted file mode 100755 index 3c423a9..0000000 --- a/python/static/svg/building.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bullhorn-solid.svg b/python/static/svg/bullhorn-solid.svg deleted file mode 100755 index 2683f4f..0000000 --- a/python/static/svg/bullhorn-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bullseye-solid.svg b/python/static/svg/bullseye-solid.svg deleted file mode 100755 index 62fc43b..0000000 --- a/python/static/svg/bullseye-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/burn-solid.svg b/python/static/svg/burn-solid.svg deleted file mode 100755 index a7a15dd..0000000 --- a/python/static/svg/burn-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/buromobelexperte.svg b/python/static/svg/buromobelexperte.svg deleted file mode 100755 index 6c27dcb..0000000 --- a/python/static/svg/buromobelexperte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bus-alt-solid.svg b/python/static/svg/bus-alt-solid.svg deleted file mode 100755 index 45089cd..0000000 --- a/python/static/svg/bus-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/bus-solid.svg b/python/static/svg/bus-solid.svg deleted file mode 100755 index 4ee17e0..0000000 --- a/python/static/svg/bus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/business-time-solid.svg b/python/static/svg/business-time-solid.svg deleted file mode 100755 index c535e45..0000000 --- a/python/static/svg/business-time-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/buy-n-large.svg b/python/static/svg/buy-n-large.svg deleted file mode 100755 index 0d377a2..0000000 --- a/python/static/svg/buy-n-large.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/buysellads.svg b/python/static/svg/buysellads.svg deleted file mode 100755 index 36d22f7..0000000 --- a/python/static/svg/buysellads.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calculator-solid.svg b/python/static/svg/calculator-solid.svg deleted file mode 100755 index 8f5422d..0000000 --- a/python/static/svg/calculator-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-alt-solid.svg b/python/static/svg/calendar-alt-solid.svg deleted file mode 100755 index 92a9f54..0000000 --- a/python/static/svg/calendar-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-alt.svg b/python/static/svg/calendar-alt.svg deleted file mode 100755 index 92a9f54..0000000 --- a/python/static/svg/calendar-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-check-solid.svg b/python/static/svg/calendar-check-solid.svg deleted file mode 100755 index 9c0962c..0000000 --- a/python/static/svg/calendar-check-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-check.svg b/python/static/svg/calendar-check.svg deleted file mode 100755 index 9c0962c..0000000 --- a/python/static/svg/calendar-check.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-day-solid.svg b/python/static/svg/calendar-day-solid.svg deleted file mode 100755 index ef21ad9..0000000 --- a/python/static/svg/calendar-day-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-minus-solid.svg b/python/static/svg/calendar-minus-solid.svg deleted file mode 100755 index e228d72..0000000 --- a/python/static/svg/calendar-minus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-minus.svg b/python/static/svg/calendar-minus.svg deleted file mode 100755 index e228d72..0000000 --- a/python/static/svg/calendar-minus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-plus-solid.svg b/python/static/svg/calendar-plus-solid.svg deleted file mode 100755 index 8e4e29b..0000000 --- a/python/static/svg/calendar-plus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-plus.svg b/python/static/svg/calendar-plus.svg deleted file mode 100755 index 8e4e29b..0000000 --- a/python/static/svg/calendar-plus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-solid.svg b/python/static/svg/calendar-solid.svg deleted file mode 100755 index 92a9f54..0000000 --- a/python/static/svg/calendar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-times-solid.svg b/python/static/svg/calendar-times-solid.svg deleted file mode 100755 index 04fd927..0000000 --- a/python/static/svg/calendar-times-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-times.svg b/python/static/svg/calendar-times.svg deleted file mode 100755 index 04fd927..0000000 --- a/python/static/svg/calendar-times.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar-week-solid.svg b/python/static/svg/calendar-week-solid.svg deleted file mode 100755 index 58b277d..0000000 --- a/python/static/svg/calendar-week-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/calendar.svg b/python/static/svg/calendar.svg deleted file mode 100755 index 92a9f54..0000000 --- a/python/static/svg/calendar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/camera-retro-solid.svg b/python/static/svg/camera-retro-solid.svg deleted file mode 100755 index dd617c8..0000000 --- a/python/static/svg/camera-retro-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/camera-solid.svg b/python/static/svg/camera-solid.svg deleted file mode 100755 index 304910f..0000000 --- a/python/static/svg/camera-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/campground-solid.svg b/python/static/svg/campground-solid.svg deleted file mode 100755 index 18498c8..0000000 --- a/python/static/svg/campground-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/canadian-maple-leaf.svg b/python/static/svg/canadian-maple-leaf.svg deleted file mode 100755 index cdcf1f7..0000000 --- a/python/static/svg/canadian-maple-leaf.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/candy-cane-solid.svg b/python/static/svg/candy-cane-solid.svg deleted file mode 100755 index 66c83c1..0000000 --- a/python/static/svg/candy-cane-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cannabis-solid.svg b/python/static/svg/cannabis-solid.svg deleted file mode 100755 index 2e5a6da..0000000 --- a/python/static/svg/cannabis-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/capsules-solid.svg b/python/static/svg/capsules-solid.svg deleted file mode 100755 index 74ef1c7..0000000 --- a/python/static/svg/capsules-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/car-alt-solid.svg b/python/static/svg/car-alt-solid.svg deleted file mode 100755 index 47f2df9..0000000 --- a/python/static/svg/car-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/car-battery-solid.svg b/python/static/svg/car-battery-solid.svg deleted file mode 100755 index 1a7d781..0000000 --- a/python/static/svg/car-battery-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/car-crash-solid.svg b/python/static/svg/car-crash-solid.svg deleted file mode 100755 index 52b0c12..0000000 --- a/python/static/svg/car-crash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/car-side-solid.svg b/python/static/svg/car-side-solid.svg deleted file mode 100755 index 7effb68..0000000 --- a/python/static/svg/car-side-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/car-solid.svg b/python/static/svg/car-solid.svg deleted file mode 100755 index 7d98258..0000000 --- a/python/static/svg/car-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-down-solid.svg b/python/static/svg/caret-down-solid.svg deleted file mode 100755 index 5b0db34..0000000 --- a/python/static/svg/caret-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-left-solid.svg b/python/static/svg/caret-left-solid.svg deleted file mode 100755 index efea6da..0000000 --- a/python/static/svg/caret-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-right-solid.svg b/python/static/svg/caret-right-solid.svg deleted file mode 100755 index 02f6ced..0000000 --- a/python/static/svg/caret-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-down-solid.svg b/python/static/svg/caret-square-down-solid.svg deleted file mode 100755 index af8bc68..0000000 --- a/python/static/svg/caret-square-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-down.svg b/python/static/svg/caret-square-down.svg deleted file mode 100755 index af8bc68..0000000 --- a/python/static/svg/caret-square-down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-left-solid.svg b/python/static/svg/caret-square-left-solid.svg deleted file mode 100755 index 477daba..0000000 --- a/python/static/svg/caret-square-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-left.svg b/python/static/svg/caret-square-left.svg deleted file mode 100755 index 477daba..0000000 --- a/python/static/svg/caret-square-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-right-solid.svg b/python/static/svg/caret-square-right-solid.svg deleted file mode 100755 index 931f517..0000000 --- a/python/static/svg/caret-square-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-right.svg b/python/static/svg/caret-square-right.svg deleted file mode 100755 index 931f517..0000000 --- a/python/static/svg/caret-square-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-up-solid.svg b/python/static/svg/caret-square-up-solid.svg deleted file mode 100755 index 5178147..0000000 --- a/python/static/svg/caret-square-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-square-up.svg b/python/static/svg/caret-square-up.svg deleted file mode 100755 index 5178147..0000000 --- a/python/static/svg/caret-square-up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/caret-up-solid.svg b/python/static/svg/caret-up-solid.svg deleted file mode 100755 index 9e096ba..0000000 --- a/python/static/svg/caret-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/carrot-solid.svg b/python/static/svg/carrot-solid.svg deleted file mode 100755 index 95f4f65..0000000 --- a/python/static/svg/carrot-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cart-arrow-down-solid.svg b/python/static/svg/cart-arrow-down-solid.svg deleted file mode 100755 index ec1590b..0000000 --- a/python/static/svg/cart-arrow-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cart-plus-solid.svg b/python/static/svg/cart-plus-solid.svg deleted file mode 100755 index 01f4799..0000000 --- a/python/static/svg/cart-plus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cash-register-solid.svg b/python/static/svg/cash-register-solid.svg deleted file mode 100755 index 21ba054..0000000 --- a/python/static/svg/cash-register-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cat-solid.svg b/python/static/svg/cat-solid.svg deleted file mode 100755 index 7abd883..0000000 --- a/python/static/svg/cat-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-amazon-pay.svg b/python/static/svg/cc-amazon-pay.svg deleted file mode 100755 index 790595e..0000000 --- a/python/static/svg/cc-amazon-pay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-amex.svg b/python/static/svg/cc-amex.svg deleted file mode 100755 index 8668f1e..0000000 --- a/python/static/svg/cc-amex.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-apple-pay.svg b/python/static/svg/cc-apple-pay.svg deleted file mode 100755 index 56e805d..0000000 --- a/python/static/svg/cc-apple-pay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-diners-club.svg b/python/static/svg/cc-diners-club.svg deleted file mode 100755 index 44989f4..0000000 --- a/python/static/svg/cc-diners-club.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-discover.svg b/python/static/svg/cc-discover.svg deleted file mode 100755 index e6ff054..0000000 --- a/python/static/svg/cc-discover.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-jcb.svg b/python/static/svg/cc-jcb.svg deleted file mode 100755 index bfe07ed..0000000 --- a/python/static/svg/cc-jcb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-mastercard.svg b/python/static/svg/cc-mastercard.svg deleted file mode 100755 index ecabc3d..0000000 --- a/python/static/svg/cc-mastercard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-paypal.svg b/python/static/svg/cc-paypal.svg deleted file mode 100755 index 14fb9f9..0000000 --- a/python/static/svg/cc-paypal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-stripe.svg b/python/static/svg/cc-stripe.svg deleted file mode 100755 index 69ad5a5..0000000 --- a/python/static/svg/cc-stripe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cc-visa.svg b/python/static/svg/cc-visa.svg deleted file mode 100755 index 5c2c347..0000000 --- a/python/static/svg/cc-visa.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/centercode.svg b/python/static/svg/centercode.svg deleted file mode 100755 index 45670d0..0000000 --- a/python/static/svg/centercode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/centos.svg b/python/static/svg/centos.svg deleted file mode 100755 index f80a64f..0000000 --- a/python/static/svg/centos.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/certificate-solid.svg b/python/static/svg/certificate-solid.svg deleted file mode 100755 index 8c583c6..0000000 --- a/python/static/svg/certificate-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chair-solid.svg b/python/static/svg/chair-solid.svg deleted file mode 100755 index 96abbc5..0000000 --- a/python/static/svg/chair-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chalkboard-solid.svg b/python/static/svg/chalkboard-solid.svg deleted file mode 100755 index 4bf0c88..0000000 --- a/python/static/svg/chalkboard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chalkboard-teacher-solid.svg b/python/static/svg/chalkboard-teacher-solid.svg deleted file mode 100755 index e6b240f..0000000 --- a/python/static/svg/chalkboard-teacher-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/charging-station-solid.svg b/python/static/svg/charging-station-solid.svg deleted file mode 100755 index 26c5433..0000000 --- a/python/static/svg/charging-station-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chart-area-solid.svg b/python/static/svg/chart-area-solid.svg deleted file mode 100755 index 915ff29..0000000 --- a/python/static/svg/chart-area-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chart-bar-solid.svg b/python/static/svg/chart-bar-solid.svg deleted file mode 100755 index 38ff8bb..0000000 --- a/python/static/svg/chart-bar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chart-bar.svg b/python/static/svg/chart-bar.svg deleted file mode 100755 index 51325a6..0000000 --- a/python/static/svg/chart-bar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chart-line-solid.svg b/python/static/svg/chart-line-solid.svg deleted file mode 100755 index b0ef059..0000000 --- a/python/static/svg/chart-line-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chart-pie-solid.svg b/python/static/svg/chart-pie-solid.svg deleted file mode 100755 index b780e92..0000000 --- a/python/static/svg/chart-pie-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/check-circle-solid.svg b/python/static/svg/check-circle-solid.svg deleted file mode 100755 index 895d616..0000000 --- a/python/static/svg/check-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/check-circle.svg b/python/static/svg/check-circle.svg deleted file mode 100755 index 895d616..0000000 --- a/python/static/svg/check-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/check-double-solid.svg b/python/static/svg/check-double-solid.svg deleted file mode 100755 index 91ddea8..0000000 --- a/python/static/svg/check-double-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/check-solid.svg b/python/static/svg/check-solid.svg deleted file mode 100755 index fa3b17b..0000000 --- a/python/static/svg/check-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/check-square-solid.svg b/python/static/svg/check-square-solid.svg deleted file mode 100755 index 7856144..0000000 --- a/python/static/svg/check-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/check-square.svg b/python/static/svg/check-square.svg deleted file mode 100755 index faef505..0000000 --- a/python/static/svg/check-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cheese-solid.svg b/python/static/svg/cheese-solid.svg deleted file mode 100755 index 3d7b4f4..0000000 --- a/python/static/svg/cheese-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-bishop-solid.svg b/python/static/svg/chess-bishop-solid.svg deleted file mode 100755 index 550df90..0000000 --- a/python/static/svg/chess-bishop-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-board-solid.svg b/python/static/svg/chess-board-solid.svg deleted file mode 100755 index 0436041..0000000 --- a/python/static/svg/chess-board-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-king-solid.svg b/python/static/svg/chess-king-solid.svg deleted file mode 100755 index 99f4141..0000000 --- a/python/static/svg/chess-king-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-knight-solid.svg b/python/static/svg/chess-knight-solid.svg deleted file mode 100755 index 9c3d398..0000000 --- a/python/static/svg/chess-knight-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-pawn-solid.svg b/python/static/svg/chess-pawn-solid.svg deleted file mode 100755 index a8c4cd8..0000000 --- a/python/static/svg/chess-pawn-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-queen-solid.svg b/python/static/svg/chess-queen-solid.svg deleted file mode 100755 index 4084b39..0000000 --- a/python/static/svg/chess-queen-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-rook-solid.svg b/python/static/svg/chess-rook-solid.svg deleted file mode 100755 index 5b49ae7..0000000 --- a/python/static/svg/chess-rook-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chess-solid.svg b/python/static/svg/chess-solid.svg deleted file mode 100755 index fc3fc63..0000000 --- a/python/static/svg/chess-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-circle-down-solid.svg b/python/static/svg/chevron-circle-down-solid.svg deleted file mode 100755 index 8bc8173..0000000 --- a/python/static/svg/chevron-circle-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-circle-left-solid.svg b/python/static/svg/chevron-circle-left-solid.svg deleted file mode 100755 index 28ec425..0000000 --- a/python/static/svg/chevron-circle-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-circle-right-solid.svg b/python/static/svg/chevron-circle-right-solid.svg deleted file mode 100755 index f748a26..0000000 --- a/python/static/svg/chevron-circle-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-circle-up-solid.svg b/python/static/svg/chevron-circle-up-solid.svg deleted file mode 100755 index 07d04e3..0000000 --- a/python/static/svg/chevron-circle-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-down-solid.svg b/python/static/svg/chevron-down-solid.svg deleted file mode 100755 index f0c1fdb..0000000 --- a/python/static/svg/chevron-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-left-solid.svg b/python/static/svg/chevron-left-solid.svg deleted file mode 100755 index 7d729c6..0000000 --- a/python/static/svg/chevron-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-right-solid.svg b/python/static/svg/chevron-right-solid.svg deleted file mode 100755 index 932fdd9..0000000 --- a/python/static/svg/chevron-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chevron-up-solid.svg b/python/static/svg/chevron-up-solid.svg deleted file mode 100755 index 0743dfc..0000000 --- a/python/static/svg/chevron-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/child-solid.svg b/python/static/svg/child-solid.svg deleted file mode 100755 index cf531c5..0000000 --- a/python/static/svg/child-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chrome.svg b/python/static/svg/chrome.svg deleted file mode 100755 index 1bcb904..0000000 --- a/python/static/svg/chrome.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/chromecast.svg b/python/static/svg/chromecast.svg deleted file mode 100755 index ee7c40a..0000000 --- a/python/static/svg/chromecast.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/church-solid.svg b/python/static/svg/church-solid.svg deleted file mode 100755 index c34de04..0000000 --- a/python/static/svg/church-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/circle-notch-solid.svg b/python/static/svg/circle-notch-solid.svg deleted file mode 100755 index 0b15831..0000000 --- a/python/static/svg/circle-notch-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/circle-solid.svg b/python/static/svg/circle-solid.svg deleted file mode 100755 index 3b08fdc..0000000 --- a/python/static/svg/circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/circle.svg b/python/static/svg/circle.svg deleted file mode 100755 index 7237089..0000000 --- a/python/static/svg/circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/city-solid.svg b/python/static/svg/city-solid.svg deleted file mode 100755 index 2bbc44f..0000000 --- a/python/static/svg/city-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clinic-medical-solid.svg b/python/static/svg/clinic-medical-solid.svg deleted file mode 100755 index f6b02a4..0000000 --- a/python/static/svg/clinic-medical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clipboard-check-solid.svg b/python/static/svg/clipboard-check-solid.svg deleted file mode 100755 index c7cf91d..0000000 --- a/python/static/svg/clipboard-check-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clipboard-list-solid.svg b/python/static/svg/clipboard-list-solid.svg deleted file mode 100755 index 558ac01..0000000 --- a/python/static/svg/clipboard-list-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clipboard-solid.svg b/python/static/svg/clipboard-solid.svg deleted file mode 100755 index 7edc3ed..0000000 --- a/python/static/svg/clipboard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clipboard.svg b/python/static/svg/clipboard.svg deleted file mode 100755 index 3425dcb..0000000 --- a/python/static/svg/clipboard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clock-solid.svg b/python/static/svg/clock-solid.svg deleted file mode 100755 index d2afde4..0000000 --- a/python/static/svg/clock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clock.svg b/python/static/svg/clock.svg deleted file mode 100755 index d2afde4..0000000 --- a/python/static/svg/clock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clone-solid.svg b/python/static/svg/clone-solid.svg deleted file mode 100755 index a5e671d..0000000 --- a/python/static/svg/clone-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/clone.svg b/python/static/svg/clone.svg deleted file mode 100755 index d6021b5..0000000 --- a/python/static/svg/clone.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/closed-captioning-solid.svg b/python/static/svg/closed-captioning-solid.svg deleted file mode 100755 index 6381616..0000000 --- a/python/static/svg/closed-captioning-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/closed-captioning.svg b/python/static/svg/closed-captioning.svg deleted file mode 100755 index 6381616..0000000 --- a/python/static/svg/closed-captioning.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-download-alt-solid.svg b/python/static/svg/cloud-download-alt-solid.svg deleted file mode 100755 index e85ac42..0000000 --- a/python/static/svg/cloud-download-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-meatball-solid.svg b/python/static/svg/cloud-meatball-solid.svg deleted file mode 100755 index b53ba1e..0000000 --- a/python/static/svg/cloud-meatball-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-moon-rain-solid.svg b/python/static/svg/cloud-moon-rain-solid.svg deleted file mode 100755 index cd15d95..0000000 --- a/python/static/svg/cloud-moon-rain-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-moon-solid.svg b/python/static/svg/cloud-moon-solid.svg deleted file mode 100755 index bbda7f8..0000000 --- a/python/static/svg/cloud-moon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-rain-solid.svg b/python/static/svg/cloud-rain-solid.svg deleted file mode 100755 index 7033c6e..0000000 --- a/python/static/svg/cloud-rain-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-showers-heavy-solid.svg b/python/static/svg/cloud-showers-heavy-solid.svg deleted file mode 100755 index 57ebe76..0000000 --- a/python/static/svg/cloud-showers-heavy-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-solid.svg b/python/static/svg/cloud-solid.svg deleted file mode 100755 index 6b9cb88..0000000 --- a/python/static/svg/cloud-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-sun-rain-solid.svg b/python/static/svg/cloud-sun-rain-solid.svg deleted file mode 100755 index f77ab87..0000000 --- a/python/static/svg/cloud-sun-rain-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-sun-solid.svg b/python/static/svg/cloud-sun-solid.svg deleted file mode 100755 index 77a8776..0000000 --- a/python/static/svg/cloud-sun-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloud-upload-alt-solid.svg b/python/static/svg/cloud-upload-alt-solid.svg deleted file mode 100755 index bf6c3e4..0000000 --- a/python/static/svg/cloud-upload-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloudscale.svg b/python/static/svg/cloudscale.svg deleted file mode 100755 index d0ab31b..0000000 --- a/python/static/svg/cloudscale.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloudsmith.svg b/python/static/svg/cloudsmith.svg deleted file mode 100755 index aa1dda5..0000000 --- a/python/static/svg/cloudsmith.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cloudversify.svg b/python/static/svg/cloudversify.svg deleted file mode 100755 index 20c474f..0000000 --- a/python/static/svg/cloudversify.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cocktail-solid.svg b/python/static/svg/cocktail-solid.svg deleted file mode 100755 index 9e5d3fc..0000000 --- a/python/static/svg/cocktail-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/code-branch-solid.svg b/python/static/svg/code-branch-solid.svg deleted file mode 100755 index 566935a..0000000 --- a/python/static/svg/code-branch-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/code-solid.svg b/python/static/svg/code-solid.svg deleted file mode 100755 index 911b0d2..0000000 --- a/python/static/svg/code-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/codepen.svg b/python/static/svg/codepen.svg deleted file mode 100755 index f57cb20..0000000 --- a/python/static/svg/codepen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/codiepie.svg b/python/static/svg/codiepie.svg deleted file mode 100755 index 436652e..0000000 --- a/python/static/svg/codiepie.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/coffee-solid.svg b/python/static/svg/coffee-solid.svg deleted file mode 100755 index c211322..0000000 --- a/python/static/svg/coffee-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cog-solid.svg b/python/static/svg/cog-solid.svg deleted file mode 100755 index 6cd0a8f..0000000 --- a/python/static/svg/cog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cogs-solid.svg b/python/static/svg/cogs-solid.svg deleted file mode 100755 index efdce61..0000000 --- a/python/static/svg/cogs-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/coins-solid.svg b/python/static/svg/coins-solid.svg deleted file mode 100755 index 0ec20d2..0000000 --- a/python/static/svg/coins-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/columns-solid.svg b/python/static/svg/columns-solid.svg deleted file mode 100755 index 0804cdc..0000000 --- a/python/static/svg/columns-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-alt-solid.svg b/python/static/svg/comment-alt-solid.svg deleted file mode 100755 index 7723da9..0000000 --- a/python/static/svg/comment-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-alt.svg b/python/static/svg/comment-alt.svg deleted file mode 100755 index 7723da9..0000000 --- a/python/static/svg/comment-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-dollar-solid.svg b/python/static/svg/comment-dollar-solid.svg deleted file mode 100755 index 639bbc3..0000000 --- a/python/static/svg/comment-dollar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-dots-solid.svg b/python/static/svg/comment-dots-solid.svg deleted file mode 100755 index 4ca1f34..0000000 --- a/python/static/svg/comment-dots-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-dots.svg b/python/static/svg/comment-dots.svg deleted file mode 100755 index 4ca1f34..0000000 --- a/python/static/svg/comment-dots.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-medical-solid.svg b/python/static/svg/comment-medical-solid.svg deleted file mode 100755 index e699531..0000000 --- a/python/static/svg/comment-medical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-slash-solid.svg b/python/static/svg/comment-slash-solid.svg deleted file mode 100755 index 0514613..0000000 --- a/python/static/svg/comment-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment-solid.svg b/python/static/svg/comment-solid.svg deleted file mode 100755 index fe61eca..0000000 --- a/python/static/svg/comment-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comment.svg b/python/static/svg/comment.svg deleted file mode 100755 index fe61eca..0000000 --- a/python/static/svg/comment.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comments-dollar-solid.svg b/python/static/svg/comments-dollar-solid.svg deleted file mode 100755 index 0f83d4f..0000000 --- a/python/static/svg/comments-dollar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comments-solid.svg b/python/static/svg/comments-solid.svg deleted file mode 100755 index 909bcd4..0000000 --- a/python/static/svg/comments-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/comments.svg b/python/static/svg/comments.svg deleted file mode 100755 index 909bcd4..0000000 --- a/python/static/svg/comments.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/compact-disc-solid.svg b/python/static/svg/compact-disc-solid.svg deleted file mode 100755 index 11969e7..0000000 --- a/python/static/svg/compact-disc-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/compass-solid.svg b/python/static/svg/compass-solid.svg deleted file mode 100755 index 3c980a2..0000000 --- a/python/static/svg/compass-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/compass.svg b/python/static/svg/compass.svg deleted file mode 100755 index 3c980a2..0000000 --- a/python/static/svg/compass.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/compress-arrows-alt-solid.svg b/python/static/svg/compress-arrows-alt-solid.svg deleted file mode 100755 index df913e3..0000000 --- a/python/static/svg/compress-arrows-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/compress-solid.svg b/python/static/svg/compress-solid.svg deleted file mode 100755 index 63f8fd3..0000000 --- a/python/static/svg/compress-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/concierge-bell-solid.svg b/python/static/svg/concierge-bell-solid.svg deleted file mode 100755 index ae72a12..0000000 --- a/python/static/svg/concierge-bell-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/confluence.svg b/python/static/svg/confluence.svg deleted file mode 100755 index 58108fa..0000000 --- a/python/static/svg/confluence.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/connectdevelop.svg b/python/static/svg/connectdevelop.svg deleted file mode 100755 index c6f97b5..0000000 --- a/python/static/svg/connectdevelop.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/contao.svg b/python/static/svg/contao.svg deleted file mode 100755 index 19782dd..0000000 --- a/python/static/svg/contao.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cookie-bite-solid.svg b/python/static/svg/cookie-bite-solid.svg deleted file mode 100755 index 22aa73d..0000000 --- a/python/static/svg/cookie-bite-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cookie-solid.svg b/python/static/svg/cookie-solid.svg deleted file mode 100755 index b4360af..0000000 --- a/python/static/svg/cookie-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/copy-solid.svg b/python/static/svg/copy-solid.svg deleted file mode 100755 index bebd3d2..0000000 --- a/python/static/svg/copy-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/copy.svg b/python/static/svg/copy.svg deleted file mode 100755 index bebd3d2..0000000 --- a/python/static/svg/copy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/copyright-solid.svg b/python/static/svg/copyright-solid.svg deleted file mode 100755 index 41fe1ac..0000000 --- a/python/static/svg/copyright-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/copyright.svg b/python/static/svg/copyright.svg deleted file mode 100755 index 41fe1ac..0000000 --- a/python/static/svg/copyright.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cotton-bureau.svg b/python/static/svg/cotton-bureau.svg deleted file mode 100755 index bf51575..0000000 --- a/python/static/svg/cotton-bureau.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/couch-solid.svg b/python/static/svg/couch-solid.svg deleted file mode 100755 index 3e90691..0000000 --- a/python/static/svg/couch-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cpanel.svg b/python/static/svg/cpanel.svg deleted file mode 100755 index 55c5f4d..0000000 --- a/python/static/svg/cpanel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-by.svg b/python/static/svg/creative-commons-by.svg deleted file mode 100755 index 179e0c6..0000000 --- a/python/static/svg/creative-commons-by.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-nc-eu.svg b/python/static/svg/creative-commons-nc-eu.svg deleted file mode 100755 index d1cd513..0000000 --- a/python/static/svg/creative-commons-nc-eu.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-nc-jp.svg b/python/static/svg/creative-commons-nc-jp.svg deleted file mode 100755 index ed93f9d..0000000 --- a/python/static/svg/creative-commons-nc-jp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-nc.svg b/python/static/svg/creative-commons-nc.svg deleted file mode 100755 index bdc8390..0000000 --- a/python/static/svg/creative-commons-nc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-nd.svg b/python/static/svg/creative-commons-nd.svg deleted file mode 100755 index 5cd0a6d..0000000 --- a/python/static/svg/creative-commons-nd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-pd-alt.svg b/python/static/svg/creative-commons-pd-alt.svg deleted file mode 100755 index b67845a..0000000 --- a/python/static/svg/creative-commons-pd-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-pd.svg b/python/static/svg/creative-commons-pd.svg deleted file mode 100755 index 8bb0376..0000000 --- a/python/static/svg/creative-commons-pd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-remix.svg b/python/static/svg/creative-commons-remix.svg deleted file mode 100755 index 79f7d77..0000000 --- a/python/static/svg/creative-commons-remix.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-sa.svg b/python/static/svg/creative-commons-sa.svg deleted file mode 100755 index db19821..0000000 --- a/python/static/svg/creative-commons-sa.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-sampling-plus.svg b/python/static/svg/creative-commons-sampling-plus.svg deleted file mode 100755 index b929136..0000000 --- a/python/static/svg/creative-commons-sampling-plus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-sampling.svg b/python/static/svg/creative-commons-sampling.svg deleted file mode 100755 index 11649cd..0000000 --- a/python/static/svg/creative-commons-sampling.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-share.svg b/python/static/svg/creative-commons-share.svg deleted file mode 100755 index e351ca7..0000000 --- a/python/static/svg/creative-commons-share.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons-zero.svg b/python/static/svg/creative-commons-zero.svg deleted file mode 100755 index 948aafe..0000000 --- a/python/static/svg/creative-commons-zero.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/creative-commons.svg b/python/static/svg/creative-commons.svg deleted file mode 100755 index 46394a7..0000000 --- a/python/static/svg/creative-commons.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/credit-card-solid.svg b/python/static/svg/credit-card-solid.svg deleted file mode 100755 index 69fa112..0000000 --- a/python/static/svg/credit-card-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/credit-card.svg b/python/static/svg/credit-card.svg deleted file mode 100755 index 69fa112..0000000 --- a/python/static/svg/credit-card.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/critical-role.svg b/python/static/svg/critical-role.svg deleted file mode 100755 index ec4a9e5..0000000 --- a/python/static/svg/critical-role.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/crop-alt-solid.svg b/python/static/svg/crop-alt-solid.svg deleted file mode 100755 index 911e08a..0000000 --- a/python/static/svg/crop-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/crop-solid.svg b/python/static/svg/crop-solid.svg deleted file mode 100755 index 8ec8eeb..0000000 --- a/python/static/svg/crop-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cross-solid.svg b/python/static/svg/cross-solid.svg deleted file mode 100755 index 7aa1606..0000000 --- a/python/static/svg/cross-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/crosshairs-solid.svg b/python/static/svg/crosshairs-solid.svg deleted file mode 100755 index c4a9500..0000000 --- a/python/static/svg/crosshairs-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/crow-solid.svg b/python/static/svg/crow-solid.svg deleted file mode 100755 index 45b0060..0000000 --- a/python/static/svg/crow-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/crown-solid.svg b/python/static/svg/crown-solid.svg deleted file mode 100755 index 783f177..0000000 --- a/python/static/svg/crown-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/crutch-solid.svg b/python/static/svg/crutch-solid.svg deleted file mode 100755 index 692dd98..0000000 --- a/python/static/svg/crutch-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/css3-alt.svg b/python/static/svg/css3-alt.svg deleted file mode 100755 index 04effb5..0000000 --- a/python/static/svg/css3-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/css3.svg b/python/static/svg/css3.svg deleted file mode 100755 index 3fb7979..0000000 --- a/python/static/svg/css3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cube-solid.svg b/python/static/svg/cube-solid.svg deleted file mode 100755 index edc6ceb..0000000 --- a/python/static/svg/cube-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cubes-solid.svg b/python/static/svg/cubes-solid.svg deleted file mode 100755 index 0652cd4..0000000 --- a/python/static/svg/cubes-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cut-solid.svg b/python/static/svg/cut-solid.svg deleted file mode 100755 index 607adf8..0000000 --- a/python/static/svg/cut-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/cuttlefish.svg b/python/static/svg/cuttlefish.svg deleted file mode 100755 index 4d3be98..0000000 --- a/python/static/svg/cuttlefish.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/d-and-d-beyond.svg b/python/static/svg/d-and-d-beyond.svg deleted file mode 100755 index aebbab3..0000000 --- a/python/static/svg/d-and-d-beyond.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/d-and-d.svg b/python/static/svg/d-and-d.svg deleted file mode 100755 index 5a4c4ac..0000000 --- a/python/static/svg/d-and-d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dashcube.svg b/python/static/svg/dashcube.svg deleted file mode 100755 index 36433f6..0000000 --- a/python/static/svg/dashcube.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/database-solid.svg b/python/static/svg/database-solid.svg deleted file mode 100755 index 83d43d3..0000000 --- a/python/static/svg/database-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/deaf-solid.svg b/python/static/svg/deaf-solid.svg deleted file mode 100755 index d9c4dc2..0000000 --- a/python/static/svg/deaf-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/delicious.svg b/python/static/svg/delicious.svg deleted file mode 100755 index 2afb90e..0000000 --- a/python/static/svg/delicious.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/democrat-solid.svg b/python/static/svg/democrat-solid.svg deleted file mode 100755 index 6854354..0000000 --- a/python/static/svg/democrat-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/deploydog.svg b/python/static/svg/deploydog.svg deleted file mode 100755 index cadda1e..0000000 --- a/python/static/svg/deploydog.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/deskpro.svg b/python/static/svg/deskpro.svg deleted file mode 100755 index 8464967..0000000 --- a/python/static/svg/deskpro.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/desktop-solid.svg b/python/static/svg/desktop-solid.svg deleted file mode 100755 index b5b02ec..0000000 --- a/python/static/svg/desktop-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dev.svg b/python/static/svg/dev.svg deleted file mode 100755 index 37d7c25..0000000 --- a/python/static/svg/dev.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/deviantart.svg b/python/static/svg/deviantart.svg deleted file mode 100755 index 5c8e915..0000000 --- a/python/static/svg/deviantart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dharmachakra-solid.svg b/python/static/svg/dharmachakra-solid.svg deleted file mode 100755 index ec42176..0000000 --- a/python/static/svg/dharmachakra-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dhl.svg b/python/static/svg/dhl.svg deleted file mode 100755 index aa5dc4c..0000000 --- a/python/static/svg/dhl.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/diagnoses-solid.svg b/python/static/svg/diagnoses-solid.svg deleted file mode 100755 index 7421cbb..0000000 --- a/python/static/svg/diagnoses-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/diaspora.svg b/python/static/svg/diaspora.svg deleted file mode 100755 index 1c42998..0000000 --- a/python/static/svg/diaspora.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-d20-solid.svg b/python/static/svg/dice-d20-solid.svg deleted file mode 100755 index b0effb8..0000000 --- a/python/static/svg/dice-d20-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-d6-solid.svg b/python/static/svg/dice-d6-solid.svg deleted file mode 100755 index 9d64ec3..0000000 --- a/python/static/svg/dice-d6-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-five-solid.svg b/python/static/svg/dice-five-solid.svg deleted file mode 100755 index ce57cac..0000000 --- a/python/static/svg/dice-five-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-four-solid.svg b/python/static/svg/dice-four-solid.svg deleted file mode 100755 index 3fe5e50..0000000 --- a/python/static/svg/dice-four-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-one-solid.svg b/python/static/svg/dice-one-solid.svg deleted file mode 100755 index 9d54fdc..0000000 --- a/python/static/svg/dice-one-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-six-solid.svg b/python/static/svg/dice-six-solid.svg deleted file mode 100755 index 5e531b6..0000000 --- a/python/static/svg/dice-six-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-solid.svg b/python/static/svg/dice-solid.svg deleted file mode 100755 index 7fbe244..0000000 --- a/python/static/svg/dice-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-three-solid.svg b/python/static/svg/dice-three-solid.svg deleted file mode 100755 index 8ac00c2..0000000 --- a/python/static/svg/dice-three-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dice-two-solid.svg b/python/static/svg/dice-two-solid.svg deleted file mode 100755 index 8ab6b98..0000000 --- a/python/static/svg/dice-two-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/digg.svg b/python/static/svg/digg.svg deleted file mode 100755 index 6e53d68..0000000 --- a/python/static/svg/digg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/digital-ocean.svg b/python/static/svg/digital-ocean.svg deleted file mode 100755 index 52a060f..0000000 --- a/python/static/svg/digital-ocean.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/digital-tachograph-solid.svg b/python/static/svg/digital-tachograph-solid.svg deleted file mode 100755 index 719bfab..0000000 --- a/python/static/svg/digital-tachograph-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/directions-solid.svg b/python/static/svg/directions-solid.svg deleted file mode 100755 index c7e4920..0000000 --- a/python/static/svg/directions-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/discord.svg b/python/static/svg/discord.svg deleted file mode 100755 index 1851021..0000000 --- a/python/static/svg/discord.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/discourse.svg b/python/static/svg/discourse.svg deleted file mode 100755 index 6a4860b..0000000 --- a/python/static/svg/discourse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/divide-solid.svg b/python/static/svg/divide-solid.svg deleted file mode 100755 index 6ddda71..0000000 --- a/python/static/svg/divide-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dizzy-solid.svg b/python/static/svg/dizzy-solid.svg deleted file mode 100755 index d1700e3..0000000 --- a/python/static/svg/dizzy-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dizzy.svg b/python/static/svg/dizzy.svg deleted file mode 100755 index d1700e3..0000000 --- a/python/static/svg/dizzy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dna-solid.svg b/python/static/svg/dna-solid.svg deleted file mode 100755 index 252e9d9..0000000 --- a/python/static/svg/dna-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dochub.svg b/python/static/svg/dochub.svg deleted file mode 100755 index 3112e4c..0000000 --- a/python/static/svg/dochub.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/docker.svg b/python/static/svg/docker.svg deleted file mode 100755 index f624434..0000000 --- a/python/static/svg/docker.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dog-solid.svg b/python/static/svg/dog-solid.svg deleted file mode 100755 index a684751..0000000 --- a/python/static/svg/dog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dollar-sign-solid.svg b/python/static/svg/dollar-sign-solid.svg deleted file mode 100755 index 9b6be55..0000000 --- a/python/static/svg/dollar-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dolly-flatbed-solid.svg b/python/static/svg/dolly-flatbed-solid.svg deleted file mode 100755 index 8f879e3..0000000 --- a/python/static/svg/dolly-flatbed-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dolly-solid.svg b/python/static/svg/dolly-solid.svg deleted file mode 100755 index a0d0468..0000000 --- a/python/static/svg/dolly-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/donate-solid.svg b/python/static/svg/donate-solid.svg deleted file mode 100755 index b66e67b..0000000 --- a/python/static/svg/donate-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/door-closed-solid.svg b/python/static/svg/door-closed-solid.svg deleted file mode 100755 index 4a68822..0000000 --- a/python/static/svg/door-closed-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/door-open-solid.svg b/python/static/svg/door-open-solid.svg deleted file mode 100755 index 4544bcd..0000000 --- a/python/static/svg/door-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dot-circle-solid.svg b/python/static/svg/dot-circle-solid.svg deleted file mode 100755 index cea5ae8..0000000 --- a/python/static/svg/dot-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dot-circle.svg b/python/static/svg/dot-circle.svg deleted file mode 100755 index cea5ae8..0000000 --- a/python/static/svg/dot-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dove-solid.svg b/python/static/svg/dove-solid.svg deleted file mode 100755 index a04a5e2..0000000 --- a/python/static/svg/dove-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/download-solid.svg b/python/static/svg/download-solid.svg deleted file mode 100755 index 66d38f0..0000000 --- a/python/static/svg/download-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/draft2digital.svg b/python/static/svg/draft2digital.svg deleted file mode 100755 index 3f42629..0000000 --- a/python/static/svg/draft2digital.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/drafting-compass-solid.svg b/python/static/svg/drafting-compass-solid.svg deleted file mode 100755 index c2de3f9..0000000 --- a/python/static/svg/drafting-compass-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dragon-solid.svg b/python/static/svg/dragon-solid.svg deleted file mode 100755 index 3811fe8..0000000 --- a/python/static/svg/dragon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/draw-polygon-solid.svg b/python/static/svg/draw-polygon-solid.svg deleted file mode 100755 index 240e21c..0000000 --- a/python/static/svg/draw-polygon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dribbble-square.svg b/python/static/svg/dribbble-square.svg deleted file mode 100755 index 96de32a..0000000 --- a/python/static/svg/dribbble-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dribbble.svg b/python/static/svg/dribbble.svg deleted file mode 100755 index db49704..0000000 --- a/python/static/svg/dribbble.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dropbox.svg b/python/static/svg/dropbox.svg deleted file mode 100755 index f64971f..0000000 --- a/python/static/svg/dropbox.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/drum-solid.svg b/python/static/svg/drum-solid.svg deleted file mode 100755 index 504ddfc..0000000 --- a/python/static/svg/drum-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/drum-steelpan-solid.svg b/python/static/svg/drum-steelpan-solid.svg deleted file mode 100755 index d1c7c4e..0000000 --- a/python/static/svg/drum-steelpan-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/drumstick-bite-solid.svg b/python/static/svg/drumstick-bite-solid.svg deleted file mode 100755 index d27604a..0000000 --- a/python/static/svg/drumstick-bite-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/drupal.svg b/python/static/svg/drupal.svg deleted file mode 100755 index b8ae695..0000000 --- a/python/static/svg/drupal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dumbbell-solid.svg b/python/static/svg/dumbbell-solid.svg deleted file mode 100755 index 2a49138..0000000 --- a/python/static/svg/dumbbell-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dumpster-fire-solid.svg b/python/static/svg/dumpster-fire-solid.svg deleted file mode 100755 index bd7fe0e..0000000 --- a/python/static/svg/dumpster-fire-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dumpster-solid.svg b/python/static/svg/dumpster-solid.svg deleted file mode 100755 index 0488f78..0000000 --- a/python/static/svg/dumpster-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dungeon-solid.svg b/python/static/svg/dungeon-solid.svg deleted file mode 100755 index 88ef37e..0000000 --- a/python/static/svg/dungeon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/dyalog.svg b/python/static/svg/dyalog.svg deleted file mode 100755 index 9dd91f2..0000000 --- a/python/static/svg/dyalog.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/earlybirds.svg b/python/static/svg/earlybirds.svg deleted file mode 100755 index b3444f6..0000000 --- a/python/static/svg/earlybirds.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ebay.svg b/python/static/svg/ebay.svg deleted file mode 100755 index 18e4ce6..0000000 --- a/python/static/svg/ebay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/edge.svg b/python/static/svg/edge.svg deleted file mode 100755 index 86faef9..0000000 --- a/python/static/svg/edge.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/edit-solid.svg b/python/static/svg/edit-solid.svg deleted file mode 100755 index 8e00efa..0000000 --- a/python/static/svg/edit-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/edit.svg b/python/static/svg/edit.svg deleted file mode 100755 index 8e00efa..0000000 --- a/python/static/svg/edit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/egg-solid.svg b/python/static/svg/egg-solid.svg deleted file mode 100755 index fb451dd..0000000 --- a/python/static/svg/egg-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/eject-solid.svg b/python/static/svg/eject-solid.svg deleted file mode 100755 index b9e4ab2..0000000 --- a/python/static/svg/eject-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/elementor.svg b/python/static/svg/elementor.svg deleted file mode 100755 index c0693a3..0000000 --- a/python/static/svg/elementor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ellipsis-h-solid.svg b/python/static/svg/ellipsis-h-solid.svg deleted file mode 100755 index 112fef8..0000000 --- a/python/static/svg/ellipsis-h-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ellipsis-v-solid.svg b/python/static/svg/ellipsis-v-solid.svg deleted file mode 100755 index e8f52db..0000000 --- a/python/static/svg/ellipsis-v-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ello.svg b/python/static/svg/ello.svg deleted file mode 100755 index c6126dd..0000000 --- a/python/static/svg/ello.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ember.svg b/python/static/svg/ember.svg deleted file mode 100755 index d5868db..0000000 --- a/python/static/svg/ember.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/empire.svg b/python/static/svg/empire.svg deleted file mode 100755 index 0207734..0000000 --- a/python/static/svg/empire.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/envelope-open-solid.svg b/python/static/svg/envelope-open-solid.svg deleted file mode 100755 index eac45b1..0000000 --- a/python/static/svg/envelope-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/envelope-open-text-solid.svg b/python/static/svg/envelope-open-text-solid.svg deleted file mode 100755 index 3d7796b..0000000 --- a/python/static/svg/envelope-open-text-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/envelope-open.svg b/python/static/svg/envelope-open.svg deleted file mode 100755 index eac45b1..0000000 --- a/python/static/svg/envelope-open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/envelope-solid.svg b/python/static/svg/envelope-solid.svg deleted file mode 100755 index 17bd663..0000000 --- a/python/static/svg/envelope-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/envelope-square-solid.svg b/python/static/svg/envelope-square-solid.svg deleted file mode 100755 index 904d91b..0000000 --- a/python/static/svg/envelope-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/envelope.svg b/python/static/svg/envelope.svg deleted file mode 100755 index 17bd663..0000000 --- a/python/static/svg/envelope.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/envira.svg b/python/static/svg/envira.svg deleted file mode 100755 index 0132919..0000000 --- a/python/static/svg/envira.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/equals-solid.svg b/python/static/svg/equals-solid.svg deleted file mode 100755 index 4d36619..0000000 --- a/python/static/svg/equals-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/eraser-solid.svg b/python/static/svg/eraser-solid.svg deleted file mode 100755 index f119e91..0000000 --- a/python/static/svg/eraser-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/erlang.svg b/python/static/svg/erlang.svg deleted file mode 100755 index bd9db0b..0000000 --- a/python/static/svg/erlang.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ethereum.svg b/python/static/svg/ethereum.svg deleted file mode 100755 index dce8d99..0000000 --- a/python/static/svg/ethereum.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ethernet-solid.svg b/python/static/svg/ethernet-solid.svg deleted file mode 100755 index 20a25f3..0000000 --- a/python/static/svg/ethernet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/etsy.svg b/python/static/svg/etsy.svg deleted file mode 100755 index c60ac96..0000000 --- a/python/static/svg/etsy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/euro-sign-solid.svg b/python/static/svg/euro-sign-solid.svg deleted file mode 100755 index 129ace9..0000000 --- a/python/static/svg/euro-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/evernote.svg b/python/static/svg/evernote.svg deleted file mode 100755 index 110c59e..0000000 --- a/python/static/svg/evernote.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/exchange-alt-solid.svg b/python/static/svg/exchange-alt-solid.svg deleted file mode 100755 index 3703804..0000000 --- a/python/static/svg/exchange-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/exclamation-circle-solid.svg b/python/static/svg/exclamation-circle-solid.svg deleted file mode 100755 index 9d4a667..0000000 --- a/python/static/svg/exclamation-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/exclamation-solid.svg b/python/static/svg/exclamation-solid.svg deleted file mode 100755 index aecfbbb..0000000 --- a/python/static/svg/exclamation-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/exclamation-triangle-solid.svg b/python/static/svg/exclamation-triangle-solid.svg deleted file mode 100755 index a934bc9..0000000 --- a/python/static/svg/exclamation-triangle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/expand-arrows-alt-solid.svg b/python/static/svg/expand-arrows-alt-solid.svg deleted file mode 100755 index f2f0b5c..0000000 --- a/python/static/svg/expand-arrows-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/expand-solid.svg b/python/static/svg/expand-solid.svg deleted file mode 100755 index c11aa2e..0000000 --- a/python/static/svg/expand-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/expeditedssl.svg b/python/static/svg/expeditedssl.svg deleted file mode 100755 index 801d085..0000000 --- a/python/static/svg/expeditedssl.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/external-link-alt-solid.svg b/python/static/svg/external-link-alt-solid.svg deleted file mode 100755 index 45ae021..0000000 --- a/python/static/svg/external-link-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/external-link-square-alt-solid.svg b/python/static/svg/external-link-square-alt-solid.svg deleted file mode 100755 index 60a709a..0000000 --- a/python/static/svg/external-link-square-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/eye-dropper-solid.svg b/python/static/svg/eye-dropper-solid.svg deleted file mode 100755 index 187b680..0000000 --- a/python/static/svg/eye-dropper-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/eye-slash-solid.svg b/python/static/svg/eye-slash-solid.svg deleted file mode 100755 index f09b5e1..0000000 --- a/python/static/svg/eye-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/eye-slash.svg b/python/static/svg/eye-slash.svg deleted file mode 100755 index 0a96d2a..0000000 --- a/python/static/svg/eye-slash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/eye-solid.svg b/python/static/svg/eye-solid.svg deleted file mode 100755 index 79b1d51..0000000 --- a/python/static/svg/eye-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/eye.svg b/python/static/svg/eye.svg deleted file mode 100755 index 79b1d51..0000000 --- a/python/static/svg/eye.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/facebook-f.svg b/python/static/svg/facebook-f.svg deleted file mode 100755 index bca80e4..0000000 --- a/python/static/svg/facebook-f.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/facebook-messenger.svg b/python/static/svg/facebook-messenger.svg deleted file mode 100755 index 199bfc2..0000000 --- a/python/static/svg/facebook-messenger.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/facebook-square.svg b/python/static/svg/facebook-square.svg deleted file mode 100755 index a135c6e..0000000 --- a/python/static/svg/facebook-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/facebook.svg b/python/static/svg/facebook.svg deleted file mode 100755 index cd2fab0..0000000 --- a/python/static/svg/facebook.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fan-solid.svg b/python/static/svg/fan-solid.svg deleted file mode 100755 index 4b7b862..0000000 --- a/python/static/svg/fan-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fantasy-flight-games.svg b/python/static/svg/fantasy-flight-games.svg deleted file mode 100755 index 837059a..0000000 --- a/python/static/svg/fantasy-flight-games.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fast-backward-solid.svg b/python/static/svg/fast-backward-solid.svg deleted file mode 100755 index 83793b6..0000000 --- a/python/static/svg/fast-backward-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fast-forward-solid.svg b/python/static/svg/fast-forward-solid.svg deleted file mode 100755 index 33f8154..0000000 --- a/python/static/svg/fast-forward-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fax-solid.svg b/python/static/svg/fax-solid.svg deleted file mode 100755 index 6bfa417..0000000 --- a/python/static/svg/fax-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/feather-alt-solid.svg b/python/static/svg/feather-alt-solid.svg deleted file mode 100755 index ccee7bd..0000000 --- a/python/static/svg/feather-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/feather-solid.svg b/python/static/svg/feather-solid.svg deleted file mode 100755 index d3c1b3a..0000000 --- a/python/static/svg/feather-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fedex.svg b/python/static/svg/fedex.svg deleted file mode 100755 index d01e439..0000000 --- a/python/static/svg/fedex.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fedora.svg b/python/static/svg/fedora.svg deleted file mode 100755 index c8d70bc..0000000 --- a/python/static/svg/fedora.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/female-solid.svg b/python/static/svg/female-solid.svg deleted file mode 100755 index b6065a5..0000000 --- a/python/static/svg/female-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fighter-jet-solid.svg b/python/static/svg/fighter-jet-solid.svg deleted file mode 100755 index 3132234..0000000 --- a/python/static/svg/fighter-jet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/figma.svg b/python/static/svg/figma.svg deleted file mode 100755 index c8a1e5d..0000000 --- a/python/static/svg/figma.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-alt-solid.svg b/python/static/svg/file-alt-solid.svg deleted file mode 100755 index 5c6f680..0000000 --- a/python/static/svg/file-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-alt.svg b/python/static/svg/file-alt.svg deleted file mode 100755 index 5c6f680..0000000 --- a/python/static/svg/file-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-archive-solid.svg b/python/static/svg/file-archive-solid.svg deleted file mode 100755 index 9285dfe..0000000 --- a/python/static/svg/file-archive-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-archive.svg b/python/static/svg/file-archive.svg deleted file mode 100755 index 9285dfe..0000000 --- a/python/static/svg/file-archive.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-audio-solid.svg b/python/static/svg/file-audio-solid.svg deleted file mode 100755 index 62f0709..0000000 --- a/python/static/svg/file-audio-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-audio.svg b/python/static/svg/file-audio.svg deleted file mode 100755 index 62f0709..0000000 --- a/python/static/svg/file-audio.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-code-solid.svg b/python/static/svg/file-code-solid.svg deleted file mode 100755 index ceef840..0000000 --- a/python/static/svg/file-code-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-code.svg b/python/static/svg/file-code.svg deleted file mode 100755 index ceef840..0000000 --- a/python/static/svg/file-code.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-contract-solid.svg b/python/static/svg/file-contract-solid.svg deleted file mode 100755 index faeabd9..0000000 --- a/python/static/svg/file-contract-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-csv-solid.svg b/python/static/svg/file-csv-solid.svg deleted file mode 100755 index bede268..0000000 --- a/python/static/svg/file-csv-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-download-solid.svg b/python/static/svg/file-download-solid.svg deleted file mode 100755 index 1256744..0000000 --- a/python/static/svg/file-download-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-excel-solid.svg b/python/static/svg/file-excel-solid.svg deleted file mode 100755 index 41e44aa..0000000 --- a/python/static/svg/file-excel-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-excel.svg b/python/static/svg/file-excel.svg deleted file mode 100755 index 41e44aa..0000000 --- a/python/static/svg/file-excel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-export-solid.svg b/python/static/svg/file-export-solid.svg deleted file mode 100755 index df4cec0..0000000 --- a/python/static/svg/file-export-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-image-solid.svg b/python/static/svg/file-image-solid.svg deleted file mode 100755 index 9fed45b..0000000 --- a/python/static/svg/file-image-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-image.svg b/python/static/svg/file-image.svg deleted file mode 100755 index 9fed45b..0000000 --- a/python/static/svg/file-image.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-import-solid.svg b/python/static/svg/file-import-solid.svg deleted file mode 100755 index 665497a..0000000 --- a/python/static/svg/file-import-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-invoice-dollar-solid.svg b/python/static/svg/file-invoice-dollar-solid.svg deleted file mode 100755 index 71c4adf..0000000 --- a/python/static/svg/file-invoice-dollar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-invoice-solid.svg b/python/static/svg/file-invoice-solid.svg deleted file mode 100755 index 2a15660..0000000 --- a/python/static/svg/file-invoice-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-medical-alt-solid.svg b/python/static/svg/file-medical-alt-solid.svg deleted file mode 100755 index 8a31ffe..0000000 --- a/python/static/svg/file-medical-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-medical-solid.svg b/python/static/svg/file-medical-solid.svg deleted file mode 100755 index e100941..0000000 --- a/python/static/svg/file-medical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-pdf-solid.svg b/python/static/svg/file-pdf-solid.svg deleted file mode 100755 index 68d8230..0000000 --- a/python/static/svg/file-pdf-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-pdf.svg b/python/static/svg/file-pdf.svg deleted file mode 100755 index 68d8230..0000000 --- a/python/static/svg/file-pdf.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-powerpoint-solid.svg b/python/static/svg/file-powerpoint-solid.svg deleted file mode 100755 index c8fd482..0000000 --- a/python/static/svg/file-powerpoint-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-powerpoint.svg b/python/static/svg/file-powerpoint.svg deleted file mode 100755 index c8fd482..0000000 --- a/python/static/svg/file-powerpoint.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-prescription-solid.svg b/python/static/svg/file-prescription-solid.svg deleted file mode 100755 index bfedb17..0000000 --- a/python/static/svg/file-prescription-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-signature-solid.svg b/python/static/svg/file-signature-solid.svg deleted file mode 100755 index 01cd6c7..0000000 --- a/python/static/svg/file-signature-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-solid.svg b/python/static/svg/file-solid.svg deleted file mode 100755 index 60dbb6a..0000000 --- a/python/static/svg/file-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-upload-solid.svg b/python/static/svg/file-upload-solid.svg deleted file mode 100755 index 6e90abf..0000000 --- a/python/static/svg/file-upload-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-video-solid.svg b/python/static/svg/file-video-solid.svg deleted file mode 100755 index b36b1b4..0000000 --- a/python/static/svg/file-video-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-video.svg b/python/static/svg/file-video.svg deleted file mode 100755 index b36b1b4..0000000 --- a/python/static/svg/file-video.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-word-solid.svg b/python/static/svg/file-word-solid.svg deleted file mode 100755 index f9f420f..0000000 --- a/python/static/svg/file-word-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file-word.svg b/python/static/svg/file-word.svg deleted file mode 100755 index f9f420f..0000000 --- a/python/static/svg/file-word.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/file.svg b/python/static/svg/file.svg deleted file mode 100755 index 60dbb6a..0000000 --- a/python/static/svg/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fill-drip-solid.svg b/python/static/svg/fill-drip-solid.svg deleted file mode 100755 index a50fe33..0000000 --- a/python/static/svg/fill-drip-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fill-solid.svg b/python/static/svg/fill-solid.svg deleted file mode 100755 index 2b25f7a..0000000 --- a/python/static/svg/fill-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/film-solid.svg b/python/static/svg/film-solid.svg deleted file mode 100755 index 55764fc..0000000 --- a/python/static/svg/film-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/filter-solid.svg b/python/static/svg/filter-solid.svg deleted file mode 100755 index 058e406..0000000 --- a/python/static/svg/filter-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fingerprint-solid.svg b/python/static/svg/fingerprint-solid.svg deleted file mode 100755 index 2f086e8..0000000 --- a/python/static/svg/fingerprint-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fire-alt-solid.svg b/python/static/svg/fire-alt-solid.svg deleted file mode 100755 index 77e7dc4..0000000 --- a/python/static/svg/fire-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fire-extinguisher-solid.svg b/python/static/svg/fire-extinguisher-solid.svg deleted file mode 100755 index 02610a0..0000000 --- a/python/static/svg/fire-extinguisher-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fire-solid.svg b/python/static/svg/fire-solid.svg deleted file mode 100755 index 7460749..0000000 --- a/python/static/svg/fire-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/firefox.svg b/python/static/svg/firefox.svg deleted file mode 100755 index b1fbfc9..0000000 --- a/python/static/svg/firefox.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/first-aid-solid.svg b/python/static/svg/first-aid-solid.svg deleted file mode 100755 index 000a5df..0000000 --- a/python/static/svg/first-aid-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/first-order-alt.svg b/python/static/svg/first-order-alt.svg deleted file mode 100755 index 6c1cc18..0000000 --- a/python/static/svg/first-order-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/first-order.svg b/python/static/svg/first-order.svg deleted file mode 100755 index df2ccf3..0000000 --- a/python/static/svg/first-order.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/firstdraft.svg b/python/static/svg/firstdraft.svg deleted file mode 100755 index 9305441..0000000 --- a/python/static/svg/firstdraft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fish-solid.svg b/python/static/svg/fish-solid.svg deleted file mode 100755 index 48801b0..0000000 --- a/python/static/svg/fish-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fist-raised-solid.svg b/python/static/svg/fist-raised-solid.svg deleted file mode 100755 index 4d80973..0000000 --- a/python/static/svg/fist-raised-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flag-checkered-solid.svg b/python/static/svg/flag-checkered-solid.svg deleted file mode 100755 index d83710b..0000000 --- a/python/static/svg/flag-checkered-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flag-solid.svg b/python/static/svg/flag-solid.svg deleted file mode 100755 index 9300ef0..0000000 --- a/python/static/svg/flag-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flag-usa-solid.svg b/python/static/svg/flag-usa-solid.svg deleted file mode 100755 index 92f5370..0000000 --- a/python/static/svg/flag-usa-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flag.svg b/python/static/svg/flag.svg deleted file mode 100755 index 9300ef0..0000000 --- a/python/static/svg/flag.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flask-solid.svg b/python/static/svg/flask-solid.svg deleted file mode 100755 index 627696b..0000000 --- a/python/static/svg/flask-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flickr.svg b/python/static/svg/flickr.svg deleted file mode 100755 index b1f3da2..0000000 --- a/python/static/svg/flickr.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flipboard.svg b/python/static/svg/flipboard.svg deleted file mode 100755 index 4d04b93..0000000 --- a/python/static/svg/flipboard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flushed-solid.svg b/python/static/svg/flushed-solid.svg deleted file mode 100755 index 6a3ddab..0000000 --- a/python/static/svg/flushed-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/flushed.svg b/python/static/svg/flushed.svg deleted file mode 100755 index 6a3ddab..0000000 --- a/python/static/svg/flushed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fly.svg b/python/static/svg/fly.svg deleted file mode 100755 index 3848782..0000000 --- a/python/static/svg/fly.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/folder-minus-solid.svg b/python/static/svg/folder-minus-solid.svg deleted file mode 100755 index 527cf63..0000000 --- a/python/static/svg/folder-minus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/folder-open-solid.svg b/python/static/svg/folder-open-solid.svg deleted file mode 100755 index 3ac102c..0000000 --- a/python/static/svg/folder-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/folder-open.svg b/python/static/svg/folder-open.svg deleted file mode 100755 index 3ac102c..0000000 --- a/python/static/svg/folder-open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/folder-plus-solid.svg b/python/static/svg/folder-plus-solid.svg deleted file mode 100755 index 40dc8ba..0000000 --- a/python/static/svg/folder-plus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/folder-solid.svg b/python/static/svg/folder-solid.svg deleted file mode 100755 index 72b7c63..0000000 --- a/python/static/svg/folder-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/folder.svg b/python/static/svg/folder.svg deleted file mode 100755 index 72b7c63..0000000 --- a/python/static/svg/folder.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/font-awesome-alt.svg b/python/static/svg/font-awesome-alt.svg deleted file mode 100755 index 5dc840e..0000000 --- a/python/static/svg/font-awesome-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/font-awesome-flag.svg b/python/static/svg/font-awesome-flag.svg deleted file mode 100755 index 83b02f6..0000000 --- a/python/static/svg/font-awesome-flag.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/font-awesome.svg b/python/static/svg/font-awesome.svg deleted file mode 100755 index 5dc840e..0000000 --- a/python/static/svg/font-awesome.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/font-solid.svg b/python/static/svg/font-solid.svg deleted file mode 100755 index 38c6ab2..0000000 --- a/python/static/svg/font-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fonticons-fi.svg b/python/static/svg/fonticons-fi.svg deleted file mode 100755 index fcb945a..0000000 --- a/python/static/svg/fonticons-fi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fonticons.svg b/python/static/svg/fonticons.svg deleted file mode 100755 index fcb945a..0000000 --- a/python/static/svg/fonticons.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/football-ball-solid.svg b/python/static/svg/football-ball-solid.svg deleted file mode 100755 index 84028c9..0000000 --- a/python/static/svg/football-ball-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fort-awesome-alt.svg b/python/static/svg/fort-awesome-alt.svg deleted file mode 100755 index 35cd83d..0000000 --- a/python/static/svg/fort-awesome-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fort-awesome.svg b/python/static/svg/fort-awesome.svg deleted file mode 100755 index 485ed6c..0000000 --- a/python/static/svg/fort-awesome.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/forumbee.svg b/python/static/svg/forumbee.svg deleted file mode 100755 index 594cb44..0000000 --- a/python/static/svg/forumbee.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/forward-solid.svg b/python/static/svg/forward-solid.svg deleted file mode 100755 index 33f8154..0000000 --- a/python/static/svg/forward-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/foursquare.svg b/python/static/svg/foursquare.svg deleted file mode 100755 index 69d63bc..0000000 --- a/python/static/svg/foursquare.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/free-code-camp.svg b/python/static/svg/free-code-camp.svg deleted file mode 100755 index 18a94dc..0000000 --- a/python/static/svg/free-code-camp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/freebsd.svg b/python/static/svg/freebsd.svg deleted file mode 100755 index 2f9ed8f..0000000 --- a/python/static/svg/freebsd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/frog-solid.svg b/python/static/svg/frog-solid.svg deleted file mode 100755 index 49c90d3..0000000 --- a/python/static/svg/frog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/frown-open-solid.svg b/python/static/svg/frown-open-solid.svg deleted file mode 100755 index b06dbae..0000000 --- a/python/static/svg/frown-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/frown-open.svg b/python/static/svg/frown-open.svg deleted file mode 100755 index b06dbae..0000000 --- a/python/static/svg/frown-open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/frown-solid.svg b/python/static/svg/frown-solid.svg deleted file mode 100755 index 471249d..0000000 --- a/python/static/svg/frown-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/frown.svg b/python/static/svg/frown.svg deleted file mode 100755 index 471249d..0000000 --- a/python/static/svg/frown.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/fulcrum.svg b/python/static/svg/fulcrum.svg deleted file mode 100755 index 50055dc..0000000 --- a/python/static/svg/fulcrum.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/funnel-dollar-solid.svg b/python/static/svg/funnel-dollar-solid.svg deleted file mode 100755 index 4f3e909..0000000 --- a/python/static/svg/funnel-dollar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/futbol-solid.svg b/python/static/svg/futbol-solid.svg deleted file mode 100755 index 9aabb8d..0000000 --- a/python/static/svg/futbol-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/futbol.svg b/python/static/svg/futbol.svg deleted file mode 100755 index 9aabb8d..0000000 --- a/python/static/svg/futbol.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/galactic-republic.svg b/python/static/svg/galactic-republic.svg deleted file mode 100755 index 0207734..0000000 --- a/python/static/svg/galactic-republic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/galactic-senate.svg b/python/static/svg/galactic-senate.svg deleted file mode 100755 index 66880e9..0000000 --- a/python/static/svg/galactic-senate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gamepad-solid.svg b/python/static/svg/gamepad-solid.svg deleted file mode 100755 index 276c526..0000000 --- a/python/static/svg/gamepad-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gas-pump-solid.svg b/python/static/svg/gas-pump-solid.svg deleted file mode 100755 index 2609639..0000000 --- a/python/static/svg/gas-pump-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gavel-solid.svg b/python/static/svg/gavel-solid.svg deleted file mode 100755 index cd14d22..0000000 --- a/python/static/svg/gavel-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gem-solid.svg b/python/static/svg/gem-solid.svg deleted file mode 100755 index f5d3629..0000000 --- a/python/static/svg/gem-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gem.svg b/python/static/svg/gem.svg deleted file mode 100755 index f5d3629..0000000 --- a/python/static/svg/gem.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/genderless-solid.svg b/python/static/svg/genderless-solid.svg deleted file mode 100755 index 4b99d6f..0000000 --- a/python/static/svg/genderless-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/get-pocket.svg b/python/static/svg/get-pocket.svg deleted file mode 100755 index a0240a6..0000000 --- a/python/static/svg/get-pocket.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gg-circle.svg b/python/static/svg/gg-circle.svg deleted file mode 100755 index df08def..0000000 --- a/python/static/svg/gg-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gg.svg b/python/static/svg/gg.svg deleted file mode 100755 index 587a0d2..0000000 --- a/python/static/svg/gg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ghost-solid.svg b/python/static/svg/ghost-solid.svg deleted file mode 100755 index 279cf84..0000000 --- a/python/static/svg/ghost-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gift-solid.svg b/python/static/svg/gift-solid.svg deleted file mode 100755 index 18e5c1a..0000000 --- a/python/static/svg/gift-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gifts-solid.svg b/python/static/svg/gifts-solid.svg deleted file mode 100755 index c1ca908..0000000 --- a/python/static/svg/gifts-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/git-alt.svg b/python/static/svg/git-alt.svg deleted file mode 100755 index eb383e9..0000000 --- a/python/static/svg/git-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/git-square.svg b/python/static/svg/git-square.svg deleted file mode 100755 index d7f4ec7..0000000 --- a/python/static/svg/git-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/git.svg b/python/static/svg/git.svg deleted file mode 100755 index eb383e9..0000000 --- a/python/static/svg/git.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/github-alt.svg b/python/static/svg/github-alt.svg deleted file mode 100755 index 5914861..0000000 --- a/python/static/svg/github-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/github-square.svg b/python/static/svg/github-square.svg deleted file mode 100755 index 6afb12a..0000000 --- a/python/static/svg/github-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/github.svg b/python/static/svg/github.svg deleted file mode 100755 index 2e2eb07..0000000 --- a/python/static/svg/github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gitkraken.svg b/python/static/svg/gitkraken.svg deleted file mode 100755 index 7ae5f93..0000000 --- a/python/static/svg/gitkraken.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gitlab.svg b/python/static/svg/gitlab.svg deleted file mode 100755 index 083ce8a..0000000 --- a/python/static/svg/gitlab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gitter.svg b/python/static/svg/gitter.svg deleted file mode 100755 index 4cc7381..0000000 --- a/python/static/svg/gitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/glass-cheers-solid.svg b/python/static/svg/glass-cheers-solid.svg deleted file mode 100755 index 55aeff6..0000000 --- a/python/static/svg/glass-cheers-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/glass-martini-alt-solid.svg b/python/static/svg/glass-martini-alt-solid.svg deleted file mode 100755 index 9e5d3fc..0000000 --- a/python/static/svg/glass-martini-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/glass-martini-solid.svg b/python/static/svg/glass-martini-solid.svg deleted file mode 100755 index 62415e0..0000000 --- a/python/static/svg/glass-martini-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/glass-whiskey-solid.svg b/python/static/svg/glass-whiskey-solid.svg deleted file mode 100755 index a125bef..0000000 --- a/python/static/svg/glass-whiskey-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/glasses-solid.svg b/python/static/svg/glasses-solid.svg deleted file mode 100755 index 166b8f5..0000000 --- a/python/static/svg/glasses-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/glide-g.svg b/python/static/svg/glide-g.svg deleted file mode 100755 index 6c3d751..0000000 --- a/python/static/svg/glide-g.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/glide.svg b/python/static/svg/glide.svg deleted file mode 100755 index 586cf1d..0000000 --- a/python/static/svg/glide.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/globe-africa-solid.svg b/python/static/svg/globe-africa-solid.svg deleted file mode 100755 index 7e995b3..0000000 --- a/python/static/svg/globe-africa-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/globe-americas-solid.svg b/python/static/svg/globe-americas-solid.svg deleted file mode 100755 index 484d28d..0000000 --- a/python/static/svg/globe-americas-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/globe-asia-solid.svg b/python/static/svg/globe-asia-solid.svg deleted file mode 100755 index 5308cb3..0000000 --- a/python/static/svg/globe-asia-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/globe-europe-solid.svg b/python/static/svg/globe-europe-solid.svg deleted file mode 100755 index 43ba8e5..0000000 --- a/python/static/svg/globe-europe-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/globe-solid.svg b/python/static/svg/globe-solid.svg deleted file mode 100755 index 89d4c44..0000000 --- a/python/static/svg/globe-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gofore.svg b/python/static/svg/gofore.svg deleted file mode 100755 index a5a8903..0000000 --- a/python/static/svg/gofore.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/golf-ball-solid.svg b/python/static/svg/golf-ball-solid.svg deleted file mode 100755 index 2c2f0c5..0000000 --- a/python/static/svg/golf-ball-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/goodreads-g.svg b/python/static/svg/goodreads-g.svg deleted file mode 100755 index fe2d93c..0000000 --- a/python/static/svg/goodreads-g.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/goodreads.svg b/python/static/svg/goodreads.svg deleted file mode 100755 index 0b8e866..0000000 --- a/python/static/svg/goodreads.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/google-drive.svg b/python/static/svg/google-drive.svg deleted file mode 100755 index cc22761..0000000 --- a/python/static/svg/google-drive.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/google-play.svg b/python/static/svg/google-play.svg deleted file mode 100755 index edec133..0000000 --- a/python/static/svg/google-play.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/google-plus-g.svg b/python/static/svg/google-plus-g.svg deleted file mode 100755 index 11e3c21..0000000 --- a/python/static/svg/google-plus-g.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/google-plus-square.svg b/python/static/svg/google-plus-square.svg deleted file mode 100755 index 62efaf4..0000000 --- a/python/static/svg/google-plus-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/google-plus.svg b/python/static/svg/google-plus.svg deleted file mode 100755 index 11e3c21..0000000 --- a/python/static/svg/google-plus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/google-wallet.svg b/python/static/svg/google-wallet.svg deleted file mode 100755 index ff9bcba..0000000 --- a/python/static/svg/google-wallet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/google.svg b/python/static/svg/google.svg deleted file mode 100755 index 5cec768..0000000 --- a/python/static/svg/google.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gopuram-solid.svg b/python/static/svg/gopuram-solid.svg deleted file mode 100755 index b69885a..0000000 --- a/python/static/svg/gopuram-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/graduation-cap-solid.svg b/python/static/svg/graduation-cap-solid.svg deleted file mode 100755 index 76a961a..0000000 --- a/python/static/svg/graduation-cap-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gratipay.svg b/python/static/svg/gratipay.svg deleted file mode 100755 index 06dfead..0000000 --- a/python/static/svg/gratipay.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grav.svg b/python/static/svg/grav.svg deleted file mode 100755 index 84b3640..0000000 --- a/python/static/svg/grav.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/greater-than-equal-solid.svg b/python/static/svg/greater-than-equal-solid.svg deleted file mode 100755 index 14c1a3f..0000000 --- a/python/static/svg/greater-than-equal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/greater-than-solid.svg b/python/static/svg/greater-than-solid.svg deleted file mode 100755 index 53b1024..0000000 --- a/python/static/svg/greater-than-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grimace-solid.svg b/python/static/svg/grimace-solid.svg deleted file mode 100755 index 8edf447..0000000 --- a/python/static/svg/grimace-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grimace.svg b/python/static/svg/grimace.svg deleted file mode 100755 index 8edf447..0000000 --- a/python/static/svg/grimace.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-alt-solid.svg b/python/static/svg/grin-alt-solid.svg deleted file mode 100755 index f4bb95c..0000000 --- a/python/static/svg/grin-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-alt.svg b/python/static/svg/grin-alt.svg deleted file mode 100755 index f4bb95c..0000000 --- a/python/static/svg/grin-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-beam-solid.svg b/python/static/svg/grin-beam-solid.svg deleted file mode 100755 index 510a7c7..0000000 --- a/python/static/svg/grin-beam-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-beam-sweat-solid.svg b/python/static/svg/grin-beam-sweat-solid.svg deleted file mode 100755 index faae2fe..0000000 --- a/python/static/svg/grin-beam-sweat-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-beam-sweat.svg b/python/static/svg/grin-beam-sweat.svg deleted file mode 100755 index faae2fe..0000000 --- a/python/static/svg/grin-beam-sweat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-beam.svg b/python/static/svg/grin-beam.svg deleted file mode 100755 index 510a7c7..0000000 --- a/python/static/svg/grin-beam.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-hearts-solid.svg b/python/static/svg/grin-hearts-solid.svg deleted file mode 100755 index ce884cb..0000000 --- a/python/static/svg/grin-hearts-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-hearts.svg b/python/static/svg/grin-hearts.svg deleted file mode 100755 index ce884cb..0000000 --- a/python/static/svg/grin-hearts.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-solid.svg b/python/static/svg/grin-solid.svg deleted file mode 100755 index be01c50..0000000 --- a/python/static/svg/grin-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-squint-solid.svg b/python/static/svg/grin-squint-solid.svg deleted file mode 100755 index d92401b..0000000 --- a/python/static/svg/grin-squint-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-squint-tears-solid.svg b/python/static/svg/grin-squint-tears-solid.svg deleted file mode 100755 index 4b3b51f..0000000 --- a/python/static/svg/grin-squint-tears-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-squint-tears.svg b/python/static/svg/grin-squint-tears.svg deleted file mode 100755 index 4b3b51f..0000000 --- a/python/static/svg/grin-squint-tears.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-squint.svg b/python/static/svg/grin-squint.svg deleted file mode 100755 index d92401b..0000000 --- a/python/static/svg/grin-squint.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-stars-solid.svg b/python/static/svg/grin-stars-solid.svg deleted file mode 100755 index 0cf20b9..0000000 --- a/python/static/svg/grin-stars-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-stars.svg b/python/static/svg/grin-stars.svg deleted file mode 100755 index 0cf20b9..0000000 --- a/python/static/svg/grin-stars.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tears-solid.svg b/python/static/svg/grin-tears-solid.svg deleted file mode 100755 index f137785..0000000 --- a/python/static/svg/grin-tears-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tears.svg b/python/static/svg/grin-tears.svg deleted file mode 100755 index f137785..0000000 --- a/python/static/svg/grin-tears.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tongue-solid.svg b/python/static/svg/grin-tongue-solid.svg deleted file mode 100755 index dbdc871..0000000 --- a/python/static/svg/grin-tongue-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tongue-squint-solid.svg b/python/static/svg/grin-tongue-squint-solid.svg deleted file mode 100755 index 1acb825..0000000 --- a/python/static/svg/grin-tongue-squint-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tongue-squint.svg b/python/static/svg/grin-tongue-squint.svg deleted file mode 100755 index 1acb825..0000000 --- a/python/static/svg/grin-tongue-squint.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tongue-wink-solid.svg b/python/static/svg/grin-tongue-wink-solid.svg deleted file mode 100755 index a7e93eb..0000000 --- a/python/static/svg/grin-tongue-wink-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tongue-wink.svg b/python/static/svg/grin-tongue-wink.svg deleted file mode 100755 index a7e93eb..0000000 --- a/python/static/svg/grin-tongue-wink.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-tongue.svg b/python/static/svg/grin-tongue.svg deleted file mode 100755 index dbdc871..0000000 --- a/python/static/svg/grin-tongue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-wink-solid.svg b/python/static/svg/grin-wink-solid.svg deleted file mode 100755 index 4e35cbf..0000000 --- a/python/static/svg/grin-wink-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin-wink.svg b/python/static/svg/grin-wink.svg deleted file mode 100755 index 4e35cbf..0000000 --- a/python/static/svg/grin-wink.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grin.svg b/python/static/svg/grin.svg deleted file mode 100755 index be01c50..0000000 --- a/python/static/svg/grin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grip-horizontal-solid.svg b/python/static/svg/grip-horizontal-solid.svg deleted file mode 100755 index a34926c..0000000 --- a/python/static/svg/grip-horizontal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grip-lines-solid.svg b/python/static/svg/grip-lines-solid.svg deleted file mode 100755 index d358baf..0000000 --- a/python/static/svg/grip-lines-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grip-lines-vertical-solid.svg b/python/static/svg/grip-lines-vertical-solid.svg deleted file mode 100755 index 6126b65..0000000 --- a/python/static/svg/grip-lines-vertical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grip-vertical-solid.svg b/python/static/svg/grip-vertical-solid.svg deleted file mode 100755 index 2a9b273..0000000 --- a/python/static/svg/grip-vertical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gripfire.svg b/python/static/svg/gripfire.svg deleted file mode 100755 index 99199e6..0000000 --- a/python/static/svg/gripfire.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/grunt.svg b/python/static/svg/grunt.svg deleted file mode 100755 index 51c73e3..0000000 --- a/python/static/svg/grunt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/guitar-solid.svg b/python/static/svg/guitar-solid.svg deleted file mode 100755 index ae0f80d..0000000 --- a/python/static/svg/guitar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/gulp.svg b/python/static/svg/gulp.svg deleted file mode 100755 index c0c2b6c..0000000 --- a/python/static/svg/gulp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/h-square-solid.svg b/python/static/svg/h-square-solid.svg deleted file mode 100755 index 4d5c78b..0000000 --- a/python/static/svg/h-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hacker-news-square.svg b/python/static/svg/hacker-news-square.svg deleted file mode 100755 index 0355834..0000000 --- a/python/static/svg/hacker-news-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hacker-news.svg b/python/static/svg/hacker-news.svg deleted file mode 100755 index 78fba50..0000000 --- a/python/static/svg/hacker-news.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hackerrank.svg b/python/static/svg/hackerrank.svg deleted file mode 100755 index 4fea86a..0000000 --- a/python/static/svg/hackerrank.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hamburger-solid.svg b/python/static/svg/hamburger-solid.svg deleted file mode 100755 index 2c9b58d..0000000 --- a/python/static/svg/hamburger-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hammer-solid.svg b/python/static/svg/hammer-solid.svg deleted file mode 100755 index 9e7fb9c..0000000 --- a/python/static/svg/hammer-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hamsa-solid.svg b/python/static/svg/hamsa-solid.svg deleted file mode 100755 index 9fdddab..0000000 --- a/python/static/svg/hamsa-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-holding-heart-solid.svg b/python/static/svg/hand-holding-heart-solid.svg deleted file mode 100755 index ec3ae7d..0000000 --- a/python/static/svg/hand-holding-heart-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-holding-solid.svg b/python/static/svg/hand-holding-solid.svg deleted file mode 100755 index 38ea43f..0000000 --- a/python/static/svg/hand-holding-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-holding-usd-solid.svg b/python/static/svg/hand-holding-usd-solid.svg deleted file mode 100755 index 4e14cbf..0000000 --- a/python/static/svg/hand-holding-usd-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-lizard-solid.svg b/python/static/svg/hand-lizard-solid.svg deleted file mode 100755 index 333b5ae..0000000 --- a/python/static/svg/hand-lizard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-lizard.svg b/python/static/svg/hand-lizard.svg deleted file mode 100755 index 333b5ae..0000000 --- a/python/static/svg/hand-lizard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-middle-finger-solid.svg b/python/static/svg/hand-middle-finger-solid.svg deleted file mode 100755 index 91f9a36..0000000 --- a/python/static/svg/hand-middle-finger-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-paper-solid.svg b/python/static/svg/hand-paper-solid.svg deleted file mode 100755 index 3c70b4e..0000000 --- a/python/static/svg/hand-paper-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-paper.svg b/python/static/svg/hand-paper.svg deleted file mode 100755 index 3c70b4e..0000000 --- a/python/static/svg/hand-paper.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-peace-solid.svg b/python/static/svg/hand-peace-solid.svg deleted file mode 100755 index 3422ad2..0000000 --- a/python/static/svg/hand-peace-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-peace.svg b/python/static/svg/hand-peace.svg deleted file mode 100755 index 3422ad2..0000000 --- a/python/static/svg/hand-peace.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-down-solid.svg b/python/static/svg/hand-point-down-solid.svg deleted file mode 100755 index 50dffab..0000000 --- a/python/static/svg/hand-point-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-down.svg b/python/static/svg/hand-point-down.svg deleted file mode 100755 index 50dffab..0000000 --- a/python/static/svg/hand-point-down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-left-solid.svg b/python/static/svg/hand-point-left-solid.svg deleted file mode 100755 index fedb9ef..0000000 --- a/python/static/svg/hand-point-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-left.svg b/python/static/svg/hand-point-left.svg deleted file mode 100755 index fedb9ef..0000000 --- a/python/static/svg/hand-point-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-right-solid.svg b/python/static/svg/hand-point-right-solid.svg deleted file mode 100755 index 0187df4..0000000 --- a/python/static/svg/hand-point-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-right.svg b/python/static/svg/hand-point-right.svg deleted file mode 100755 index 0187df4..0000000 --- a/python/static/svg/hand-point-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-up-solid.svg b/python/static/svg/hand-point-up-solid.svg deleted file mode 100755 index 2bf0d04..0000000 --- a/python/static/svg/hand-point-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-point-up.svg b/python/static/svg/hand-point-up.svg deleted file mode 100755 index 2bf0d04..0000000 --- a/python/static/svg/hand-point-up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-pointer-solid.svg b/python/static/svg/hand-pointer-solid.svg deleted file mode 100755 index da51b7e..0000000 --- a/python/static/svg/hand-pointer-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-pointer.svg b/python/static/svg/hand-pointer.svg deleted file mode 100755 index da51b7e..0000000 --- a/python/static/svg/hand-pointer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-rock-solid.svg b/python/static/svg/hand-rock-solid.svg deleted file mode 100755 index e64b6d8..0000000 --- a/python/static/svg/hand-rock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-rock.svg b/python/static/svg/hand-rock.svg deleted file mode 100755 index e64b6d8..0000000 --- a/python/static/svg/hand-rock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-scissors-solid.svg b/python/static/svg/hand-scissors-solid.svg deleted file mode 100755 index ab933df..0000000 --- a/python/static/svg/hand-scissors-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-scissors.svg b/python/static/svg/hand-scissors.svg deleted file mode 100755 index ab933df..0000000 --- a/python/static/svg/hand-scissors.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-spock-solid.svg b/python/static/svg/hand-spock-solid.svg deleted file mode 100755 index 60bceb1..0000000 --- a/python/static/svg/hand-spock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hand-spock.svg b/python/static/svg/hand-spock.svg deleted file mode 100755 index 60bceb1..0000000 --- a/python/static/svg/hand-spock.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hands-helping-solid.svg b/python/static/svg/hands-helping-solid.svg deleted file mode 100755 index 115d1a2..0000000 --- a/python/static/svg/hands-helping-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hands-solid.svg b/python/static/svg/hands-solid.svg deleted file mode 100755 index aeec48b..0000000 --- a/python/static/svg/hands-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/handshake-solid.svg b/python/static/svg/handshake-solid.svg deleted file mode 100755 index 26082e5..0000000 --- a/python/static/svg/handshake-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/handshake.svg b/python/static/svg/handshake.svg deleted file mode 100755 index 26082e5..0000000 --- a/python/static/svg/handshake.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hanukiah-solid.svg b/python/static/svg/hanukiah-solid.svg deleted file mode 100755 index 8c72c39..0000000 --- a/python/static/svg/hanukiah-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hard-hat-solid.svg b/python/static/svg/hard-hat-solid.svg deleted file mode 100755 index efd973a..0000000 --- a/python/static/svg/hard-hat-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hashtag-solid.svg b/python/static/svg/hashtag-solid.svg deleted file mode 100755 index 2c77734..0000000 --- a/python/static/svg/hashtag-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hat-cowboy-side-solid.svg b/python/static/svg/hat-cowboy-side-solid.svg deleted file mode 100755 index e9d2e4d..0000000 --- a/python/static/svg/hat-cowboy-side-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hat-cowboy-solid.svg b/python/static/svg/hat-cowboy-solid.svg deleted file mode 100755 index a0b4ccf..0000000 --- a/python/static/svg/hat-cowboy-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hat-wizard-solid.svg b/python/static/svg/hat-wizard-solid.svg deleted file mode 100755 index 8851f8f..0000000 --- a/python/static/svg/hat-wizard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/haykal-solid.svg b/python/static/svg/haykal-solid.svg deleted file mode 100755 index 2d9059f..0000000 --- a/python/static/svg/haykal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hdd-solid.svg b/python/static/svg/hdd-solid.svg deleted file mode 100755 index 1b4f6e1..0000000 --- a/python/static/svg/hdd-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hdd.svg b/python/static/svg/hdd.svg deleted file mode 100755 index 1b4f6e1..0000000 --- a/python/static/svg/hdd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/heading-solid.svg b/python/static/svg/heading-solid.svg deleted file mode 100755 index 81a4b69..0000000 --- a/python/static/svg/heading-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/headphones-alt-solid.svg b/python/static/svg/headphones-alt-solid.svg deleted file mode 100755 index cc9aa9f..0000000 --- a/python/static/svg/headphones-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/headphones-solid.svg b/python/static/svg/headphones-solid.svg deleted file mode 100755 index cc9aa9f..0000000 --- a/python/static/svg/headphones-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/headset-solid.svg b/python/static/svg/headset-solid.svg deleted file mode 100755 index e31b23c..0000000 --- a/python/static/svg/headset-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/heart-broken-solid.svg b/python/static/svg/heart-broken-solid.svg deleted file mode 100755 index 3a942d6..0000000 --- a/python/static/svg/heart-broken-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/heart-solid.svg b/python/static/svg/heart-solid.svg deleted file mode 100755 index ddd62cb..0000000 --- a/python/static/svg/heart-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/heart.svg b/python/static/svg/heart.svg deleted file mode 100755 index 8a5654a..0000000 --- a/python/static/svg/heart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/heartbeat-solid.svg b/python/static/svg/heartbeat-solid.svg deleted file mode 100755 index d75d3fd..0000000 --- a/python/static/svg/heartbeat-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/helicopter-solid.svg b/python/static/svg/helicopter-solid.svg deleted file mode 100755 index e243585..0000000 --- a/python/static/svg/helicopter-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/highlighter-solid.svg b/python/static/svg/highlighter-solid.svg deleted file mode 100755 index 07dbbfa..0000000 --- a/python/static/svg/highlighter-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hiking-solid.svg b/python/static/svg/hiking-solid.svg deleted file mode 100755 index 5c4176c..0000000 --- a/python/static/svg/hiking-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hippo-solid.svg b/python/static/svg/hippo-solid.svg deleted file mode 100755 index 2a966ca..0000000 --- a/python/static/svg/hippo-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hips.svg b/python/static/svg/hips.svg deleted file mode 100755 index 0c71484..0000000 --- a/python/static/svg/hips.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hire-a-helper.svg b/python/static/svg/hire-a-helper.svg deleted file mode 100755 index f434882..0000000 --- a/python/static/svg/hire-a-helper.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/history-solid.svg b/python/static/svg/history-solid.svg deleted file mode 100755 index af9a072..0000000 --- a/python/static/svg/history-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hockey-puck-solid.svg b/python/static/svg/hockey-puck-solid.svg deleted file mode 100755 index 8696300..0000000 --- a/python/static/svg/hockey-puck-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/holly-berry-solid.svg b/python/static/svg/holly-berry-solid.svg deleted file mode 100755 index 978e984..0000000 --- a/python/static/svg/holly-berry-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/home-solid.svg b/python/static/svg/home-solid.svg deleted file mode 100755 index f335573..0000000 --- a/python/static/svg/home-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hooli.svg b/python/static/svg/hooli.svg deleted file mode 100755 index 7474a3b..0000000 --- a/python/static/svg/hooli.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hornbill.svg b/python/static/svg/hornbill.svg deleted file mode 100755 index f33515f..0000000 --- a/python/static/svg/hornbill.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/horse-head-solid.svg b/python/static/svg/horse-head-solid.svg deleted file mode 100755 index b3ef6fa..0000000 --- a/python/static/svg/horse-head-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/horse-solid.svg b/python/static/svg/horse-solid.svg deleted file mode 100755 index 773252e..0000000 --- a/python/static/svg/horse-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hospital-alt-solid.svg b/python/static/svg/hospital-alt-solid.svg deleted file mode 100755 index f6b02a4..0000000 --- a/python/static/svg/hospital-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hospital-solid.svg b/python/static/svg/hospital-solid.svg deleted file mode 100755 index aed56e9..0000000 --- a/python/static/svg/hospital-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hospital-symbol-solid.svg b/python/static/svg/hospital-symbol-solid.svg deleted file mode 100755 index 4d5c78b..0000000 --- a/python/static/svg/hospital-symbol-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hospital.svg b/python/static/svg/hospital.svg deleted file mode 100755 index aed56e9..0000000 --- a/python/static/svg/hospital.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hot-tub-solid.svg b/python/static/svg/hot-tub-solid.svg deleted file mode 100755 index 0542bf0..0000000 --- a/python/static/svg/hot-tub-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hotdog-solid.svg b/python/static/svg/hotdog-solid.svg deleted file mode 100755 index c11a490..0000000 --- a/python/static/svg/hotdog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hotel-solid.svg b/python/static/svg/hotel-solid.svg deleted file mode 100755 index c83412c..0000000 --- a/python/static/svg/hotel-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hotjar.svg b/python/static/svg/hotjar.svg deleted file mode 100755 index 6e650c1..0000000 --- a/python/static/svg/hotjar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hourglass-end-solid.svg b/python/static/svg/hourglass-end-solid.svg deleted file mode 100755 index 061c9a1..0000000 --- a/python/static/svg/hourglass-end-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hourglass-half-solid.svg b/python/static/svg/hourglass-half-solid.svg deleted file mode 100755 index 2872f37..0000000 --- a/python/static/svg/hourglass-half-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hourglass-solid.svg b/python/static/svg/hourglass-solid.svg deleted file mode 100755 index 7926d2c..0000000 --- a/python/static/svg/hourglass-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hourglass-start-solid.svg b/python/static/svg/hourglass-start-solid.svg deleted file mode 100755 index c4d6580..0000000 --- a/python/static/svg/hourglass-start-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hourglass.svg b/python/static/svg/hourglass.svg deleted file mode 100755 index 7926d2c..0000000 --- a/python/static/svg/hourglass.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/house-damage-solid.svg b/python/static/svg/house-damage-solid.svg deleted file mode 100755 index c02e4b5..0000000 --- a/python/static/svg/house-damage-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/houzz.svg b/python/static/svg/houzz.svg deleted file mode 100755 index 091dd46..0000000 --- a/python/static/svg/houzz.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hryvnia-solid.svg b/python/static/svg/hryvnia-solid.svg deleted file mode 100755 index 69ae397..0000000 --- a/python/static/svg/hryvnia-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/html5.svg b/python/static/svg/html5.svg deleted file mode 100755 index 6d84358..0000000 --- a/python/static/svg/html5.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/hubspot.svg b/python/static/svg/hubspot.svg deleted file mode 100755 index 9563a8e..0000000 --- a/python/static/svg/hubspot.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/i-cursor-solid.svg b/python/static/svg/i-cursor-solid.svg deleted file mode 100755 index ad24121..0000000 --- a/python/static/svg/i-cursor-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ice-cream-solid.svg b/python/static/svg/ice-cream-solid.svg deleted file mode 100755 index c5823bd..0000000 --- a/python/static/svg/ice-cream-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/icicles-solid.svg b/python/static/svg/icicles-solid.svg deleted file mode 100755 index 191e2d6..0000000 --- a/python/static/svg/icicles-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/icons-solid.svg b/python/static/svg/icons-solid.svg deleted file mode 100755 index 4381c52..0000000 --- a/python/static/svg/icons-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/id-badge-solid.svg b/python/static/svg/id-badge-solid.svg deleted file mode 100755 index 9b88903..0000000 --- a/python/static/svg/id-badge-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/id-badge.svg b/python/static/svg/id-badge.svg deleted file mode 100755 index 9b88903..0000000 --- a/python/static/svg/id-badge.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/id-card-alt-solid.svg b/python/static/svg/id-card-alt-solid.svg deleted file mode 100755 index 00c3215..0000000 --- a/python/static/svg/id-card-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/id-card-solid.svg b/python/static/svg/id-card-solid.svg deleted file mode 100755 index 8c6e1ff..0000000 --- a/python/static/svg/id-card-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/id-card.svg b/python/static/svg/id-card.svg deleted file mode 100755 index 8c6e1ff..0000000 --- a/python/static/svg/id-card.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/igloo-solid.svg b/python/static/svg/igloo-solid.svg deleted file mode 100755 index 54ff882..0000000 --- a/python/static/svg/igloo-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/image-solid.svg b/python/static/svg/image-solid.svg deleted file mode 100755 index 06b90ac..0000000 --- a/python/static/svg/image-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/image.svg b/python/static/svg/image.svg deleted file mode 100755 index 06b90ac..0000000 --- a/python/static/svg/image.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/images-solid.svg b/python/static/svg/images-solid.svg deleted file mode 100755 index 326895c..0000000 --- a/python/static/svg/images-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/images.svg b/python/static/svg/images.svg deleted file mode 100755 index 326895c..0000000 --- a/python/static/svg/images.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/imdb.svg b/python/static/svg/imdb.svg deleted file mode 100755 index 27d9f77..0000000 --- a/python/static/svg/imdb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/inbox-solid.svg b/python/static/svg/inbox-solid.svg deleted file mode 100755 index 960ed7b..0000000 --- a/python/static/svg/inbox-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/indent-solid.svg b/python/static/svg/indent-solid.svg deleted file mode 100755 index bccc4a5..0000000 --- a/python/static/svg/indent-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/industry-solid.svg b/python/static/svg/industry-solid.svg deleted file mode 100755 index 960b578..0000000 --- a/python/static/svg/industry-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/infinity-solid.svg b/python/static/svg/infinity-solid.svg deleted file mode 100755 index 2a00ac0..0000000 --- a/python/static/svg/infinity-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/info-circle-solid.svg b/python/static/svg/info-circle-solid.svg deleted file mode 100755 index 4077a0a..0000000 --- a/python/static/svg/info-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/info-solid.svg b/python/static/svg/info-solid.svg deleted file mode 100755 index 0d3fc3d..0000000 --- a/python/static/svg/info-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/instagram.svg b/python/static/svg/instagram.svg deleted file mode 100755 index 4c9589a..0000000 --- a/python/static/svg/instagram.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/intercom.svg b/python/static/svg/intercom.svg deleted file mode 100755 index c06fb6d..0000000 --- a/python/static/svg/intercom.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/internet-explorer.svg b/python/static/svg/internet-explorer.svg deleted file mode 100755 index fb09fda..0000000 --- a/python/static/svg/internet-explorer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/invision.svg b/python/static/svg/invision.svg deleted file mode 100755 index 05020dc..0000000 --- a/python/static/svg/invision.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ioxhost.svg b/python/static/svg/ioxhost.svg deleted file mode 100755 index ebeee4c..0000000 --- a/python/static/svg/ioxhost.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/italic-solid.svg b/python/static/svg/italic-solid.svg deleted file mode 100755 index 02b80c7..0000000 --- a/python/static/svg/italic-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/itch-io.svg b/python/static/svg/itch-io.svg deleted file mode 100755 index c8c1ce8..0000000 --- a/python/static/svg/itch-io.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/itunes-note.svg b/python/static/svg/itunes-note.svg deleted file mode 100755 index 38c908b..0000000 --- a/python/static/svg/itunes-note.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/itunes.svg b/python/static/svg/itunes.svg deleted file mode 100755 index 584d01c..0000000 --- a/python/static/svg/itunes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/java.svg b/python/static/svg/java.svg deleted file mode 100755 index c809ad4..0000000 --- a/python/static/svg/java.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/jedi-order.svg b/python/static/svg/jedi-order.svg deleted file mode 100755 index 01bcdea..0000000 --- a/python/static/svg/jedi-order.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/jedi-solid.svg b/python/static/svg/jedi-solid.svg deleted file mode 100755 index 9e706cc..0000000 --- a/python/static/svg/jedi-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/jenkins.svg b/python/static/svg/jenkins.svg deleted file mode 100755 index 678cc93..0000000 --- a/python/static/svg/jenkins.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/jira.svg b/python/static/svg/jira.svg deleted file mode 100755 index 9816d2c..0000000 --- a/python/static/svg/jira.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/joget.svg b/python/static/svg/joget.svg deleted file mode 100755 index 5185ff9..0000000 --- a/python/static/svg/joget.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/joint-solid.svg b/python/static/svg/joint-solid.svg deleted file mode 100755 index c81f0e8..0000000 --- a/python/static/svg/joint-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/joomla.svg b/python/static/svg/joomla.svg deleted file mode 100755 index 2440d2c..0000000 --- a/python/static/svg/joomla.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/journal-whills-solid.svg b/python/static/svg/journal-whills-solid.svg deleted file mode 100755 index 23bef66..0000000 --- a/python/static/svg/journal-whills-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/js-square.svg b/python/static/svg/js-square.svg deleted file mode 100755 index af0ea5a..0000000 --- a/python/static/svg/js-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/js.svg b/python/static/svg/js.svg deleted file mode 100755 index 80c5f4c..0000000 --- a/python/static/svg/js.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/jsfiddle.svg b/python/static/svg/jsfiddle.svg deleted file mode 100755 index 23075d5..0000000 --- a/python/static/svg/jsfiddle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kaaba-solid.svg b/python/static/svg/kaaba-solid.svg deleted file mode 100755 index ca519b5..0000000 --- a/python/static/svg/kaaba-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kaggle.svg b/python/static/svg/kaggle.svg deleted file mode 100755 index d04b3ef..0000000 --- a/python/static/svg/kaggle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/key-solid.svg b/python/static/svg/key-solid.svg deleted file mode 100755 index 34ff02d..0000000 --- a/python/static/svg/key-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/keybase.svg b/python/static/svg/keybase.svg deleted file mode 100755 index 065833d..0000000 --- a/python/static/svg/keybase.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/keyboard-solid.svg b/python/static/svg/keyboard-solid.svg deleted file mode 100755 index d1dd1d6..0000000 --- a/python/static/svg/keyboard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/keyboard.svg b/python/static/svg/keyboard.svg deleted file mode 100755 index d1dd1d6..0000000 --- a/python/static/svg/keyboard.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/keycdn.svg b/python/static/svg/keycdn.svg deleted file mode 100755 index fd41a54..0000000 --- a/python/static/svg/keycdn.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/khanda-solid.svg b/python/static/svg/khanda-solid.svg deleted file mode 100755 index ec45475..0000000 --- a/python/static/svg/khanda-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kickstarter-k.svg b/python/static/svg/kickstarter-k.svg deleted file mode 100755 index b486bd8..0000000 --- a/python/static/svg/kickstarter-k.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kickstarter.svg b/python/static/svg/kickstarter.svg deleted file mode 100755 index a2d1745..0000000 --- a/python/static/svg/kickstarter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kiss-beam-solid.svg b/python/static/svg/kiss-beam-solid.svg deleted file mode 100755 index 6c49ced..0000000 --- a/python/static/svg/kiss-beam-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kiss-beam.svg b/python/static/svg/kiss-beam.svg deleted file mode 100755 index 6c49ced..0000000 --- a/python/static/svg/kiss-beam.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kiss-solid.svg b/python/static/svg/kiss-solid.svg deleted file mode 100755 index 7ab7954..0000000 --- a/python/static/svg/kiss-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kiss-wink-heart-solid.svg b/python/static/svg/kiss-wink-heart-solid.svg deleted file mode 100755 index b717a26..0000000 --- a/python/static/svg/kiss-wink-heart-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kiss-wink-heart.svg b/python/static/svg/kiss-wink-heart.svg deleted file mode 100755 index b717a26..0000000 --- a/python/static/svg/kiss-wink-heart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kiss.svg b/python/static/svg/kiss.svg deleted file mode 100755 index 7ab7954..0000000 --- a/python/static/svg/kiss.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/kiwi-bird-solid.svg b/python/static/svg/kiwi-bird-solid.svg deleted file mode 100755 index d474731..0000000 --- a/python/static/svg/kiwi-bird-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/korvue.svg b/python/static/svg/korvue.svg deleted file mode 100755 index 64351e0..0000000 --- a/python/static/svg/korvue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/landmark-solid.svg b/python/static/svg/landmark-solid.svg deleted file mode 100755 index 4e78323..0000000 --- a/python/static/svg/landmark-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/language-solid.svg b/python/static/svg/language-solid.svg deleted file mode 100755 index a0a5459..0000000 --- a/python/static/svg/language-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laptop-code-solid.svg b/python/static/svg/laptop-code-solid.svg deleted file mode 100755 index dbf6ecf..0000000 --- a/python/static/svg/laptop-code-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laptop-medical-solid.svg b/python/static/svg/laptop-medical-solid.svg deleted file mode 100755 index 054327e..0000000 --- a/python/static/svg/laptop-medical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laptop-solid.svg b/python/static/svg/laptop-solid.svg deleted file mode 100755 index 028b60f..0000000 --- a/python/static/svg/laptop-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laravel.svg b/python/static/svg/laravel.svg deleted file mode 100755 index 4b5b17b..0000000 --- a/python/static/svg/laravel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lastfm-square.svg b/python/static/svg/lastfm-square.svg deleted file mode 100755 index fd4b343..0000000 --- a/python/static/svg/lastfm-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lastfm.svg b/python/static/svg/lastfm.svg deleted file mode 100755 index 56a3426..0000000 --- a/python/static/svg/lastfm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh-beam-solid.svg b/python/static/svg/laugh-beam-solid.svg deleted file mode 100755 index 510a7c7..0000000 --- a/python/static/svg/laugh-beam-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh-beam.svg b/python/static/svg/laugh-beam.svg deleted file mode 100755 index 510a7c7..0000000 --- a/python/static/svg/laugh-beam.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh-solid.svg b/python/static/svg/laugh-solid.svg deleted file mode 100755 index be01c50..0000000 --- a/python/static/svg/laugh-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh-squint-solid.svg b/python/static/svg/laugh-squint-solid.svg deleted file mode 100755 index d92401b..0000000 --- a/python/static/svg/laugh-squint-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh-squint.svg b/python/static/svg/laugh-squint.svg deleted file mode 100755 index d92401b..0000000 --- a/python/static/svg/laugh-squint.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh-wink-solid.svg b/python/static/svg/laugh-wink-solid.svg deleted file mode 100755 index bd32ed5..0000000 --- a/python/static/svg/laugh-wink-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh-wink.svg b/python/static/svg/laugh-wink.svg deleted file mode 100755 index bd32ed5..0000000 --- a/python/static/svg/laugh-wink.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/laugh.svg b/python/static/svg/laugh.svg deleted file mode 100755 index be01c50..0000000 --- a/python/static/svg/laugh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/layer-group-solid.svg b/python/static/svg/layer-group-solid.svg deleted file mode 100755 index 760a891..0000000 --- a/python/static/svg/layer-group-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/leaf-solid.svg b/python/static/svg/leaf-solid.svg deleted file mode 100755 index e224213..0000000 --- a/python/static/svg/leaf-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/leanpub.svg b/python/static/svg/leanpub.svg deleted file mode 100755 index 3f6cefd..0000000 --- a/python/static/svg/leanpub.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lemon-solid.svg b/python/static/svg/lemon-solid.svg deleted file mode 100755 index 76fac7d..0000000 --- a/python/static/svg/lemon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lemon.svg b/python/static/svg/lemon.svg deleted file mode 100755 index 76fac7d..0000000 --- a/python/static/svg/lemon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/less-than-equal-solid.svg b/python/static/svg/less-than-equal-solid.svg deleted file mode 100755 index 0208383..0000000 --- a/python/static/svg/less-than-equal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/less-than-solid.svg b/python/static/svg/less-than-solid.svg deleted file mode 100755 index a683396..0000000 --- a/python/static/svg/less-than-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/less.svg b/python/static/svg/less.svg deleted file mode 100755 index c03545a..0000000 --- a/python/static/svg/less.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/level-down-alt-solid.svg b/python/static/svg/level-down-alt-solid.svg deleted file mode 100755 index fa9d514..0000000 --- a/python/static/svg/level-down-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/level-up-alt-solid.svg b/python/static/svg/level-up-alt-solid.svg deleted file mode 100755 index 5f68371..0000000 --- a/python/static/svg/level-up-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/life-ring-solid.svg b/python/static/svg/life-ring-solid.svg deleted file mode 100755 index e464b82..0000000 --- a/python/static/svg/life-ring-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/life-ring.svg b/python/static/svg/life-ring.svg deleted file mode 100755 index e464b82..0000000 --- a/python/static/svg/life-ring.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lightbulb-solid.svg b/python/static/svg/lightbulb-solid.svg deleted file mode 100755 index 046fb15..0000000 --- a/python/static/svg/lightbulb-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lightbulb.svg b/python/static/svg/lightbulb.svg deleted file mode 100755 index 046fb15..0000000 --- a/python/static/svg/lightbulb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/line.svg b/python/static/svg/line.svg deleted file mode 100755 index be3b69f..0000000 --- a/python/static/svg/line.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/link-solid.svg b/python/static/svg/link-solid.svg deleted file mode 100755 index 79006e6..0000000 --- a/python/static/svg/link-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/linkedin-in.svg b/python/static/svg/linkedin-in.svg deleted file mode 100755 index aa1f95e..0000000 --- a/python/static/svg/linkedin-in.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/linkedin.svg b/python/static/svg/linkedin.svg deleted file mode 100755 index 596f003..0000000 --- a/python/static/svg/linkedin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/linode.svg b/python/static/svg/linode.svg deleted file mode 100755 index e26a724..0000000 --- a/python/static/svg/linode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/linux.svg b/python/static/svg/linux.svg deleted file mode 100755 index 28506de..0000000 --- a/python/static/svg/linux.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lira-sign-solid.svg b/python/static/svg/lira-sign-solid.svg deleted file mode 100755 index 0418f12..0000000 --- a/python/static/svg/lira-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/list-alt-solid.svg b/python/static/svg/list-alt-solid.svg deleted file mode 100755 index 2b5cfbe..0000000 --- a/python/static/svg/list-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/list-alt.svg b/python/static/svg/list-alt.svg deleted file mode 100755 index 2b5cfbe..0000000 --- a/python/static/svg/list-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/list-ol-solid.svg b/python/static/svg/list-ol-solid.svg deleted file mode 100755 index ec322f1..0000000 --- a/python/static/svg/list-ol-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/list-solid.svg b/python/static/svg/list-solid.svg deleted file mode 100755 index 4cfe33a..0000000 --- a/python/static/svg/list-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/list-ul-solid.svg b/python/static/svg/list-ul-solid.svg deleted file mode 100755 index 4cfe33a..0000000 --- a/python/static/svg/list-ul-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/location-arrow-solid.svg b/python/static/svg/location-arrow-solid.svg deleted file mode 100755 index a8b058b..0000000 --- a/python/static/svg/location-arrow-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lock-open-solid.svg b/python/static/svg/lock-open-solid.svg deleted file mode 100755 index d2517a5..0000000 --- a/python/static/svg/lock-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lock-solid.svg b/python/static/svg/lock-solid.svg deleted file mode 100755 index 1a80d98..0000000 --- a/python/static/svg/lock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/long-arrow-alt-down-solid.svg b/python/static/svg/long-arrow-alt-down-solid.svg deleted file mode 100755 index 10b445c..0000000 --- a/python/static/svg/long-arrow-alt-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/long-arrow-alt-left-solid.svg b/python/static/svg/long-arrow-alt-left-solid.svg deleted file mode 100755 index 4f0269b..0000000 --- a/python/static/svg/long-arrow-alt-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/long-arrow-alt-right-solid.svg b/python/static/svg/long-arrow-alt-right-solid.svg deleted file mode 100755 index 4afe071..0000000 --- a/python/static/svg/long-arrow-alt-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/long-arrow-alt-up-solid.svg b/python/static/svg/long-arrow-alt-up-solid.svg deleted file mode 100755 index 7b6a1a8..0000000 --- a/python/static/svg/long-arrow-alt-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/low-vision-solid.svg b/python/static/svg/low-vision-solid.svg deleted file mode 100755 index b6dab10..0000000 --- a/python/static/svg/low-vision-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/luggage-cart-solid.svg b/python/static/svg/luggage-cart-solid.svg deleted file mode 100755 index 8f879e3..0000000 --- a/python/static/svg/luggage-cart-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/lyft.svg b/python/static/svg/lyft.svg deleted file mode 100755 index 3aa28b4..0000000 --- a/python/static/svg/lyft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/magento.svg b/python/static/svg/magento.svg deleted file mode 100755 index bda731b..0000000 --- a/python/static/svg/magento.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/magic-solid.svg b/python/static/svg/magic-solid.svg deleted file mode 100755 index 3f936e4..0000000 --- a/python/static/svg/magic-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/magnet-solid.svg b/python/static/svg/magnet-solid.svg deleted file mode 100755 index fe70573..0000000 --- a/python/static/svg/magnet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mail-bulk-solid.svg b/python/static/svg/mail-bulk-solid.svg deleted file mode 100755 index edab7bc..0000000 --- a/python/static/svg/mail-bulk-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mailchimp.svg b/python/static/svg/mailchimp.svg deleted file mode 100755 index 3086962..0000000 --- a/python/static/svg/mailchimp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/male-solid.svg b/python/static/svg/male-solid.svg deleted file mode 100755 index de83329..0000000 --- a/python/static/svg/male-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mandalorian.svg b/python/static/svg/mandalorian.svg deleted file mode 100755 index 468391b..0000000 --- a/python/static/svg/mandalorian.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map-marked-alt-solid.svg b/python/static/svg/map-marked-alt-solid.svg deleted file mode 100755 index 9eb862f..0000000 --- a/python/static/svg/map-marked-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map-marked-solid.svg b/python/static/svg/map-marked-solid.svg deleted file mode 100755 index b82f246..0000000 --- a/python/static/svg/map-marked-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map-marker-alt-solid.svg b/python/static/svg/map-marker-alt-solid.svg deleted file mode 100755 index 49d1f83..0000000 --- a/python/static/svg/map-marker-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map-marker-solid.svg b/python/static/svg/map-marker-solid.svg deleted file mode 100755 index 49d1f83..0000000 --- a/python/static/svg/map-marker-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map-pin-solid.svg b/python/static/svg/map-pin-solid.svg deleted file mode 100755 index 1afbc7d..0000000 --- a/python/static/svg/map-pin-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map-signs-solid.svg b/python/static/svg/map-signs-solid.svg deleted file mode 100755 index 75753be..0000000 --- a/python/static/svg/map-signs-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map-solid.svg b/python/static/svg/map-solid.svg deleted file mode 100755 index 367b574..0000000 --- a/python/static/svg/map-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/map.svg b/python/static/svg/map.svg deleted file mode 100755 index 367b574..0000000 --- a/python/static/svg/map.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/markdown.svg b/python/static/svg/markdown.svg deleted file mode 100755 index c866d37..0000000 --- a/python/static/svg/markdown.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/marker-solid.svg b/python/static/svg/marker-solid.svg deleted file mode 100755 index 07dbbfa..0000000 --- a/python/static/svg/marker-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mars-double-solid.svg b/python/static/svg/mars-double-solid.svg deleted file mode 100755 index 93368ea..0000000 --- a/python/static/svg/mars-double-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mars-solid.svg b/python/static/svg/mars-solid.svg deleted file mode 100755 index 1ffb4c9..0000000 --- a/python/static/svg/mars-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mars-stroke-h-solid.svg b/python/static/svg/mars-stroke-h-solid.svg deleted file mode 100755 index 8257248..0000000 --- a/python/static/svg/mars-stroke-h-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mars-stroke-solid.svg b/python/static/svg/mars-stroke-solid.svg deleted file mode 100755 index 68fc786..0000000 --- a/python/static/svg/mars-stroke-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mars-stroke-v-solid.svg b/python/static/svg/mars-stroke-v-solid.svg deleted file mode 100755 index cf71628..0000000 --- a/python/static/svg/mars-stroke-v-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mask-solid.svg b/python/static/svg/mask-solid.svg deleted file mode 100755 index 6b29aa9..0000000 --- a/python/static/svg/mask-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mastodon.svg b/python/static/svg/mastodon.svg deleted file mode 100755 index 3bde68c..0000000 --- a/python/static/svg/mastodon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/maxcdn.svg b/python/static/svg/maxcdn.svg deleted file mode 100755 index 80ac7bd..0000000 --- a/python/static/svg/maxcdn.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mdb.svg b/python/static/svg/mdb.svg deleted file mode 100755 index fe1a9f7..0000000 --- a/python/static/svg/mdb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/medal-solid.svg b/python/static/svg/medal-solid.svg deleted file mode 100755 index 4594064..0000000 --- a/python/static/svg/medal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/medapps.svg b/python/static/svg/medapps.svg deleted file mode 100755 index 3a8423f..0000000 --- a/python/static/svg/medapps.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/medium-m.svg b/python/static/svg/medium-m.svg deleted file mode 100755 index 70e5287..0000000 --- a/python/static/svg/medium-m.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/medium.svg b/python/static/svg/medium.svg deleted file mode 100755 index 70e5287..0000000 --- a/python/static/svg/medium.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/medkit-solid.svg b/python/static/svg/medkit-solid.svg deleted file mode 100755 index 000a5df..0000000 --- a/python/static/svg/medkit-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/medrt.svg b/python/static/svg/medrt.svg deleted file mode 100755 index 6ff0367..0000000 --- a/python/static/svg/medrt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meetup.svg b/python/static/svg/meetup.svg deleted file mode 100755 index 5c0cc5b..0000000 --- a/python/static/svg/meetup.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/megaport.svg b/python/static/svg/megaport.svg deleted file mode 100755 index 021f94e..0000000 --- a/python/static/svg/megaport.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meh-blank-solid.svg b/python/static/svg/meh-blank-solid.svg deleted file mode 100755 index fb7c241..0000000 --- a/python/static/svg/meh-blank-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meh-blank.svg b/python/static/svg/meh-blank.svg deleted file mode 100755 index fb7c241..0000000 --- a/python/static/svg/meh-blank.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meh-rolling-eyes-solid.svg b/python/static/svg/meh-rolling-eyes-solid.svg deleted file mode 100755 index e5f11a3..0000000 --- a/python/static/svg/meh-rolling-eyes-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meh-rolling-eyes.svg b/python/static/svg/meh-rolling-eyes.svg deleted file mode 100755 index e5f11a3..0000000 --- a/python/static/svg/meh-rolling-eyes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meh-solid.svg b/python/static/svg/meh-solid.svg deleted file mode 100755 index c6426ec..0000000 --- a/python/static/svg/meh-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meh.svg b/python/static/svg/meh.svg deleted file mode 100755 index c6426ec..0000000 --- a/python/static/svg/meh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/memory-solid.svg b/python/static/svg/memory-solid.svg deleted file mode 100755 index ec30db8..0000000 --- a/python/static/svg/memory-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mendeley.svg b/python/static/svg/mendeley.svg deleted file mode 100755 index 00c3f2a..0000000 --- a/python/static/svg/mendeley.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/menorah-solid.svg b/python/static/svg/menorah-solid.svg deleted file mode 100755 index d3a8795..0000000 --- a/python/static/svg/menorah-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mercury-solid.svg b/python/static/svg/mercury-solid.svg deleted file mode 100755 index 9d43159..0000000 --- a/python/static/svg/mercury-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/meteor-solid.svg b/python/static/svg/meteor-solid.svg deleted file mode 100755 index c377c2d..0000000 --- a/python/static/svg/meteor-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/microchip-solid.svg b/python/static/svg/microchip-solid.svg deleted file mode 100755 index 118f281..0000000 --- a/python/static/svg/microchip-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/microphone-alt-slash-solid.svg b/python/static/svg/microphone-alt-slash-solid.svg deleted file mode 100755 index 984191d..0000000 --- a/python/static/svg/microphone-alt-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/microphone-alt-solid.svg b/python/static/svg/microphone-alt-solid.svg deleted file mode 100755 index d6f732f..0000000 --- a/python/static/svg/microphone-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/microphone-slash-solid.svg b/python/static/svg/microphone-slash-solid.svg deleted file mode 100755 index d1eba00..0000000 --- a/python/static/svg/microphone-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/microphone-solid.svg b/python/static/svg/microphone-solid.svg deleted file mode 100755 index 09742da..0000000 --- a/python/static/svg/microphone-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/microscope-solid.svg b/python/static/svg/microscope-solid.svg deleted file mode 100755 index 347a649..0000000 --- a/python/static/svg/microscope-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/microsoft.svg b/python/static/svg/microsoft.svg deleted file mode 100755 index 7536631..0000000 --- a/python/static/svg/microsoft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/minus-circle-solid.svg b/python/static/svg/minus-circle-solid.svg deleted file mode 100755 index f97b88d..0000000 --- a/python/static/svg/minus-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/minus-solid.svg b/python/static/svg/minus-solid.svg deleted file mode 100755 index 5f167dc..0000000 --- a/python/static/svg/minus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/minus-square-solid.svg b/python/static/svg/minus-square-solid.svg deleted file mode 100755 index 5a3b0bc..0000000 --- a/python/static/svg/minus-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/minus-square.svg b/python/static/svg/minus-square.svg deleted file mode 100755 index 5a3b0bc..0000000 --- a/python/static/svg/minus-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mitten-solid.svg b/python/static/svg/mitten-solid.svg deleted file mode 100755 index 192f84b..0000000 --- a/python/static/svg/mitten-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mix.svg b/python/static/svg/mix.svg deleted file mode 100755 index be24d1f..0000000 --- a/python/static/svg/mix.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mixcloud.svg b/python/static/svg/mixcloud.svg deleted file mode 100755 index bfa9ae8..0000000 --- a/python/static/svg/mixcloud.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mizuni.svg b/python/static/svg/mizuni.svg deleted file mode 100755 index a1fa864..0000000 --- a/python/static/svg/mizuni.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mobile-alt-solid.svg b/python/static/svg/mobile-alt-solid.svg deleted file mode 100755 index ebfb4e7..0000000 --- a/python/static/svg/mobile-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mobile-solid.svg b/python/static/svg/mobile-solid.svg deleted file mode 100755 index ebfb4e7..0000000 --- a/python/static/svg/mobile-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/modx.svg b/python/static/svg/modx.svg deleted file mode 100755 index ccefab7..0000000 --- a/python/static/svg/modx.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/monero.svg b/python/static/svg/monero.svg deleted file mode 100755 index 7780d66..0000000 --- a/python/static/svg/monero.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/money-bill-alt-solid.svg b/python/static/svg/money-bill-alt-solid.svg deleted file mode 100755 index ed2cb1d..0000000 --- a/python/static/svg/money-bill-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/money-bill-alt.svg b/python/static/svg/money-bill-alt.svg deleted file mode 100755 index ed2cb1d..0000000 --- a/python/static/svg/money-bill-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/money-bill-solid.svg b/python/static/svg/money-bill-solid.svg deleted file mode 100755 index fd0b2b4..0000000 --- a/python/static/svg/money-bill-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/money-bill-wave-alt-solid.svg b/python/static/svg/money-bill-wave-alt-solid.svg deleted file mode 100755 index fe65c8d..0000000 --- a/python/static/svg/money-bill-wave-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/money-bill-wave-solid.svg b/python/static/svg/money-bill-wave-solid.svg deleted file mode 100755 index a3183bc..0000000 --- a/python/static/svg/money-bill-wave-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/money-check-alt-solid.svg b/python/static/svg/money-check-alt-solid.svg deleted file mode 100755 index 80f1e14..0000000 --- a/python/static/svg/money-check-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/money-check-solid.svg b/python/static/svg/money-check-solid.svg deleted file mode 100755 index 91c9f01..0000000 --- a/python/static/svg/money-check-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/monument-solid.svg b/python/static/svg/monument-solid.svg deleted file mode 100755 index 0fcea34..0000000 --- a/python/static/svg/monument-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/moon-solid.svg b/python/static/svg/moon-solid.svg deleted file mode 100755 index ddf0d17..0000000 --- a/python/static/svg/moon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/moon.svg b/python/static/svg/moon.svg deleted file mode 100755 index ddf0d17..0000000 --- a/python/static/svg/moon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mortar-pestle-solid.svg b/python/static/svg/mortar-pestle-solid.svg deleted file mode 100755 index 81e44da..0000000 --- a/python/static/svg/mortar-pestle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mosque-solid.svg b/python/static/svg/mosque-solid.svg deleted file mode 100755 index a49c1fe..0000000 --- a/python/static/svg/mosque-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/motorcycle-solid.svg b/python/static/svg/motorcycle-solid.svg deleted file mode 100755 index ff0f85e..0000000 --- a/python/static/svg/motorcycle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mountain-solid.svg b/python/static/svg/mountain-solid.svg deleted file mode 100755 index ad952d9..0000000 --- a/python/static/svg/mountain-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mouse-pointer-solid.svg b/python/static/svg/mouse-pointer-solid.svg deleted file mode 100755 index a9915d8..0000000 --- a/python/static/svg/mouse-pointer-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mouse-solid.svg b/python/static/svg/mouse-solid.svg deleted file mode 100755 index a9ba798..0000000 --- a/python/static/svg/mouse-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/mug-hot-solid.svg b/python/static/svg/mug-hot-solid.svg deleted file mode 100755 index 15d9130..0000000 --- a/python/static/svg/mug-hot-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/music-solid.svg b/python/static/svg/music-solid.svg deleted file mode 100755 index 9c1e6ae..0000000 --- a/python/static/svg/music-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/napster.svg b/python/static/svg/napster.svg deleted file mode 100755 index 73a891f..0000000 --- a/python/static/svg/napster.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/neos.svg b/python/static/svg/neos.svg deleted file mode 100755 index c563826..0000000 --- a/python/static/svg/neos.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/network-wired-solid.svg b/python/static/svg/network-wired-solid.svg deleted file mode 100755 index aaea101..0000000 --- a/python/static/svg/network-wired-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/neuter-solid.svg b/python/static/svg/neuter-solid.svg deleted file mode 100755 index 4b99d6f..0000000 --- a/python/static/svg/neuter-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/newspaper-solid.svg b/python/static/svg/newspaper-solid.svg deleted file mode 100755 index 56a2553..0000000 --- a/python/static/svg/newspaper-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/newspaper.svg b/python/static/svg/newspaper.svg deleted file mode 100755 index 56a2553..0000000 --- a/python/static/svg/newspaper.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/nimblr.svg b/python/static/svg/nimblr.svg deleted file mode 100755 index 6b2c817..0000000 --- a/python/static/svg/nimblr.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/node-js.svg b/python/static/svg/node-js.svg deleted file mode 100755 index 3215293..0000000 --- a/python/static/svg/node-js.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/node.svg b/python/static/svg/node.svg deleted file mode 100755 index 15fce3e..0000000 --- a/python/static/svg/node.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/not-equal-solid.svg b/python/static/svg/not-equal-solid.svg deleted file mode 100755 index ddacbd9..0000000 --- a/python/static/svg/not-equal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/notes-medical-solid.svg b/python/static/svg/notes-medical-solid.svg deleted file mode 100755 index ec97527..0000000 --- a/python/static/svg/notes-medical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/npm.svg b/python/static/svg/npm.svg deleted file mode 100755 index 3444d5a..0000000 --- a/python/static/svg/npm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ns8.svg b/python/static/svg/ns8.svg deleted file mode 100755 index 8c606c0..0000000 --- a/python/static/svg/ns8.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/nutritionix.svg b/python/static/svg/nutritionix.svg deleted file mode 100755 index 5b75c2d..0000000 --- a/python/static/svg/nutritionix.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/object-group-solid.svg b/python/static/svg/object-group-solid.svg deleted file mode 100755 index 00c1892..0000000 --- a/python/static/svg/object-group-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/object-group.svg b/python/static/svg/object-group.svg deleted file mode 100755 index 00c1892..0000000 --- a/python/static/svg/object-group.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/object-ungroup-solid.svg b/python/static/svg/object-ungroup-solid.svg deleted file mode 100755 index c5f70e6..0000000 --- a/python/static/svg/object-ungroup-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/object-ungroup.svg b/python/static/svg/object-ungroup.svg deleted file mode 100755 index c5f70e6..0000000 --- a/python/static/svg/object-ungroup.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/odnoklassniki-square.svg b/python/static/svg/odnoklassniki-square.svg deleted file mode 100755 index 784be46..0000000 --- a/python/static/svg/odnoklassniki-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/odnoklassniki.svg b/python/static/svg/odnoklassniki.svg deleted file mode 100755 index 0b1bea3..0000000 --- a/python/static/svg/odnoklassniki.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/oil-can-solid.svg b/python/static/svg/oil-can-solid.svg deleted file mode 100755 index 409569f..0000000 --- a/python/static/svg/oil-can-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/old-republic.svg b/python/static/svg/old-republic.svg deleted file mode 100755 index d3bd090..0000000 --- a/python/static/svg/old-republic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/om-solid.svg b/python/static/svg/om-solid.svg deleted file mode 100755 index 03840e6..0000000 --- a/python/static/svg/om-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/opencart.svg b/python/static/svg/opencart.svg deleted file mode 100755 index 5f7a84b..0000000 --- a/python/static/svg/opencart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/openid.svg b/python/static/svg/openid.svg deleted file mode 100755 index 5226556..0000000 --- a/python/static/svg/openid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/opera.svg b/python/static/svg/opera.svg deleted file mode 100755 index 0b37c0d..0000000 --- a/python/static/svg/opera.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/optin-monster.svg b/python/static/svg/optin-monster.svg deleted file mode 100755 index 9c7ae20..0000000 --- a/python/static/svg/optin-monster.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/orcid.svg b/python/static/svg/orcid.svg deleted file mode 100755 index 1fad19c..0000000 --- a/python/static/svg/orcid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/osi.svg b/python/static/svg/osi.svg deleted file mode 100755 index 0c61167..0000000 --- a/python/static/svg/osi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/otter-solid.svg b/python/static/svg/otter-solid.svg deleted file mode 100755 index 02b6d75..0000000 --- a/python/static/svg/otter-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/outdent-solid.svg b/python/static/svg/outdent-solid.svg deleted file mode 100755 index dc2bb36..0000000 --- a/python/static/svg/outdent-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/page4.svg b/python/static/svg/page4.svg deleted file mode 100755 index b4b089c..0000000 --- a/python/static/svg/page4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pagelines.svg b/python/static/svg/pagelines.svg deleted file mode 100755 index 3fa3185..0000000 --- a/python/static/svg/pagelines.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pager-solid.svg b/python/static/svg/pager-solid.svg deleted file mode 100755 index 74df2b2..0000000 --- a/python/static/svg/pager-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paint-brush-solid.svg b/python/static/svg/paint-brush-solid.svg deleted file mode 100755 index d64f682..0000000 --- a/python/static/svg/paint-brush-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paint-roller-solid.svg b/python/static/svg/paint-roller-solid.svg deleted file mode 100755 index 4878a28..0000000 --- a/python/static/svg/paint-roller-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/palette-solid.svg b/python/static/svg/palette-solid.svg deleted file mode 100755 index 3fe5bf9..0000000 --- a/python/static/svg/palette-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/palfed.svg b/python/static/svg/palfed.svg deleted file mode 100755 index 1db5d72..0000000 --- a/python/static/svg/palfed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pallet-solid.svg b/python/static/svg/pallet-solid.svg deleted file mode 100755 index 36533d8..0000000 --- a/python/static/svg/pallet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paper-plane-solid.svg b/python/static/svg/paper-plane-solid.svg deleted file mode 100755 index a8f9a4f..0000000 --- a/python/static/svg/paper-plane-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paper-plane.svg b/python/static/svg/paper-plane.svg deleted file mode 100755 index a8f9a4f..0000000 --- a/python/static/svg/paper-plane.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paperclip-solid.svg b/python/static/svg/paperclip-solid.svg deleted file mode 100755 index 362e07c..0000000 --- a/python/static/svg/paperclip-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/parachute-box-solid.svg b/python/static/svg/parachute-box-solid.svg deleted file mode 100755 index cb30471..0000000 --- a/python/static/svg/parachute-box-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paragraph-solid.svg b/python/static/svg/paragraph-solid.svg deleted file mode 100755 index c9769cf..0000000 --- a/python/static/svg/paragraph-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/parking-solid.svg b/python/static/svg/parking-solid.svg deleted file mode 100755 index 8a3b46f..0000000 --- a/python/static/svg/parking-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/passport-solid.svg b/python/static/svg/passport-solid.svg deleted file mode 100755 index e736f8b..0000000 --- a/python/static/svg/passport-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pastafarianism-solid.svg b/python/static/svg/pastafarianism-solid.svg deleted file mode 100755 index 99cead7..0000000 --- a/python/static/svg/pastafarianism-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paste-solid.svg b/python/static/svg/paste-solid.svg deleted file mode 100755 index 7edc3ed..0000000 --- a/python/static/svg/paste-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/patreon.svg b/python/static/svg/patreon.svg deleted file mode 100755 index 4256276..0000000 --- a/python/static/svg/patreon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pause-circle-solid.svg b/python/static/svg/pause-circle-solid.svg deleted file mode 100755 index 9d62ef8..0000000 --- a/python/static/svg/pause-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pause-circle.svg b/python/static/svg/pause-circle.svg deleted file mode 100755 index 9d62ef8..0000000 --- a/python/static/svg/pause-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pause-solid.svg b/python/static/svg/pause-solid.svg deleted file mode 100755 index f151ae6..0000000 --- a/python/static/svg/pause-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paw-solid.svg b/python/static/svg/paw-solid.svg deleted file mode 100755 index 066bf36..0000000 --- a/python/static/svg/paw-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/paypal.svg b/python/static/svg/paypal.svg deleted file mode 100755 index 14fb9f9..0000000 --- a/python/static/svg/paypal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/peace-solid.svg b/python/static/svg/peace-solid.svg deleted file mode 100755 index 6d9445e..0000000 --- a/python/static/svg/peace-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pen-alt-solid.svg b/python/static/svg/pen-alt-solid.svg deleted file mode 100755 index 55ed966..0000000 --- a/python/static/svg/pen-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pen-fancy-solid.svg b/python/static/svg/pen-fancy-solid.svg deleted file mode 100755 index 5f3e631..0000000 --- a/python/static/svg/pen-fancy-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pen-nib-solid.svg b/python/static/svg/pen-nib-solid.svg deleted file mode 100755 index 3aa56a2..0000000 --- a/python/static/svg/pen-nib-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pen-solid.svg b/python/static/svg/pen-solid.svg deleted file mode 100755 index 83ea49b..0000000 --- a/python/static/svg/pen-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pen-square-solid.svg b/python/static/svg/pen-square-solid.svg deleted file mode 100755 index 426b104..0000000 --- a/python/static/svg/pen-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pencil-alt-solid.svg b/python/static/svg/pencil-alt-solid.svg deleted file mode 100755 index 8286663..0000000 --- a/python/static/svg/pencil-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pencil-ruler-solid.svg b/python/static/svg/pencil-ruler-solid.svg deleted file mode 100755 index 97aa10b..0000000 --- a/python/static/svg/pencil-ruler-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/penny-arcade.svg b/python/static/svg/penny-arcade.svg deleted file mode 100755 index 855c5b9..0000000 --- a/python/static/svg/penny-arcade.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/people-carry-solid.svg b/python/static/svg/people-carry-solid.svg deleted file mode 100755 index 9aff7d2..0000000 --- a/python/static/svg/people-carry-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pepper-hot-solid.svg b/python/static/svg/pepper-hot-solid.svg deleted file mode 100755 index 88ed3f2..0000000 --- a/python/static/svg/pepper-hot-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/percent-solid.svg b/python/static/svg/percent-solid.svg deleted file mode 100755 index 0386950..0000000 --- a/python/static/svg/percent-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/percentage-solid.svg b/python/static/svg/percentage-solid.svg deleted file mode 100755 index 8cf817e..0000000 --- a/python/static/svg/percentage-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/periscope.svg b/python/static/svg/periscope.svg deleted file mode 100755 index 09c0f78..0000000 --- a/python/static/svg/periscope.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/person-booth-solid.svg b/python/static/svg/person-booth-solid.svg deleted file mode 100755 index 371751f..0000000 --- a/python/static/svg/person-booth-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phabricator.svg b/python/static/svg/phabricator.svg deleted file mode 100755 index cc3eea5..0000000 --- a/python/static/svg/phabricator.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phoenix-framework.svg b/python/static/svg/phoenix-framework.svg deleted file mode 100755 index 28a68cd..0000000 --- a/python/static/svg/phoenix-framework.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phoenix-squadron.svg b/python/static/svg/phoenix-squadron.svg deleted file mode 100755 index ac4bd05..0000000 --- a/python/static/svg/phoenix-squadron.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phone-alt-solid.svg b/python/static/svg/phone-alt-solid.svg deleted file mode 100755 index 552017a..0000000 --- a/python/static/svg/phone-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phone-slash-solid.svg b/python/static/svg/phone-slash-solid.svg deleted file mode 100755 index 6332731..0000000 --- a/python/static/svg/phone-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phone-solid.svg b/python/static/svg/phone-solid.svg deleted file mode 100755 index 3962e32..0000000 --- a/python/static/svg/phone-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phone-square-alt-solid.svg b/python/static/svg/phone-square-alt-solid.svg deleted file mode 100755 index 03dae7b..0000000 --- a/python/static/svg/phone-square-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phone-square-solid.svg b/python/static/svg/phone-square-solid.svg deleted file mode 100755 index 0b96cf9..0000000 --- a/python/static/svg/phone-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/phone-volume-solid.svg b/python/static/svg/phone-volume-solid.svg deleted file mode 100755 index 6648dcf..0000000 --- a/python/static/svg/phone-volume-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/photo-video-solid.svg b/python/static/svg/photo-video-solid.svg deleted file mode 100755 index 35f1567..0000000 --- a/python/static/svg/photo-video-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/php.svg b/python/static/svg/php.svg deleted file mode 100755 index 70553db..0000000 --- a/python/static/svg/php.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pied-piper-alt.svg b/python/static/svg/pied-piper-alt.svg deleted file mode 100755 index f5efba4..0000000 --- a/python/static/svg/pied-piper-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pied-piper-hat.svg b/python/static/svg/pied-piper-hat.svg deleted file mode 100755 index 743bac2..0000000 --- a/python/static/svg/pied-piper-hat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pied-piper-pp.svg b/python/static/svg/pied-piper-pp.svg deleted file mode 100755 index aef6a52..0000000 --- a/python/static/svg/pied-piper-pp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pied-piper.svg b/python/static/svg/pied-piper.svg deleted file mode 100755 index aef6a52..0000000 --- a/python/static/svg/pied-piper.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/piggy-bank-solid.svg b/python/static/svg/piggy-bank-solid.svg deleted file mode 100755 index aac27fe..0000000 --- a/python/static/svg/piggy-bank-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pills-solid.svg b/python/static/svg/pills-solid.svg deleted file mode 100755 index 887053e..0000000 --- a/python/static/svg/pills-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pinterest-p.svg b/python/static/svg/pinterest-p.svg deleted file mode 100755 index 95645a3..0000000 --- a/python/static/svg/pinterest-p.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pinterest-square.svg b/python/static/svg/pinterest-square.svg deleted file mode 100755 index 18b4063..0000000 --- a/python/static/svg/pinterest-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pinterest.svg b/python/static/svg/pinterest.svg deleted file mode 100755 index bcd1106..0000000 --- a/python/static/svg/pinterest.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pizza-slice-solid.svg b/python/static/svg/pizza-slice-solid.svg deleted file mode 100755 index 96f363f..0000000 --- a/python/static/svg/pizza-slice-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/place-of-worship-solid.svg b/python/static/svg/place-of-worship-solid.svg deleted file mode 100755 index 007ee25..0000000 --- a/python/static/svg/place-of-worship-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plane-arrival-solid.svg b/python/static/svg/plane-arrival-solid.svg deleted file mode 100755 index 4e89401..0000000 --- a/python/static/svg/plane-arrival-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plane-departure-solid.svg b/python/static/svg/plane-departure-solid.svg deleted file mode 100755 index 0f17bd7..0000000 --- a/python/static/svg/plane-departure-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plane-solid.svg b/python/static/svg/plane-solid.svg deleted file mode 100755 index 92873f8..0000000 --- a/python/static/svg/plane-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/play-circle-solid.svg b/python/static/svg/play-circle-solid.svg deleted file mode 100755 index d0faa10..0000000 --- a/python/static/svg/play-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/play-circle.svg b/python/static/svg/play-circle.svg deleted file mode 100755 index d0faa10..0000000 --- a/python/static/svg/play-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/play-solid.svg b/python/static/svg/play-solid.svg deleted file mode 100755 index 3c6c813..0000000 --- a/python/static/svg/play-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/playstation.svg b/python/static/svg/playstation.svg deleted file mode 100755 index a32d4eb..0000000 --- a/python/static/svg/playstation.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plug-solid.svg b/python/static/svg/plug-solid.svg deleted file mode 100755 index dc4cd28..0000000 --- a/python/static/svg/plug-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plus-circle-solid.svg b/python/static/svg/plus-circle-solid.svg deleted file mode 100755 index c37f2c2..0000000 --- a/python/static/svg/plus-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plus-solid.svg b/python/static/svg/plus-solid.svg deleted file mode 100755 index 84a8db7..0000000 --- a/python/static/svg/plus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plus-square-solid.svg b/python/static/svg/plus-square-solid.svg deleted file mode 100755 index a22b521..0000000 --- a/python/static/svg/plus-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/plus-square.svg b/python/static/svg/plus-square.svg deleted file mode 100755 index a22b521..0000000 --- a/python/static/svg/plus-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/podcast-solid.svg b/python/static/svg/podcast-solid.svg deleted file mode 100755 index bc1f3e2..0000000 --- a/python/static/svg/podcast-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/poll-h-solid.svg b/python/static/svg/poll-h-solid.svg deleted file mode 100755 index e91ec6b..0000000 --- a/python/static/svg/poll-h-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/poll-solid.svg b/python/static/svg/poll-solid.svg deleted file mode 100755 index 2445541..0000000 --- a/python/static/svg/poll-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/poo-solid.svg b/python/static/svg/poo-solid.svg deleted file mode 100755 index 8abf941..0000000 --- a/python/static/svg/poo-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/poo-storm-solid.svg b/python/static/svg/poo-storm-solid.svg deleted file mode 100755 index 1bc5311..0000000 --- a/python/static/svg/poo-storm-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/poop-solid.svg b/python/static/svg/poop-solid.svg deleted file mode 100755 index 37e907f..0000000 --- a/python/static/svg/poop-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/portrait-solid.svg b/python/static/svg/portrait-solid.svg deleted file mode 100755 index 4e44881..0000000 --- a/python/static/svg/portrait-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pound-sign-solid.svg b/python/static/svg/pound-sign-solid.svg deleted file mode 100755 index d205109..0000000 --- a/python/static/svg/pound-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/power-off-solid.svg b/python/static/svg/power-off-solid.svg deleted file mode 100755 index 7f3e251..0000000 --- a/python/static/svg/power-off-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pray-solid.svg b/python/static/svg/pray-solid.svg deleted file mode 100755 index ad6da2c..0000000 --- a/python/static/svg/pray-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/praying-hands-solid.svg b/python/static/svg/praying-hands-solid.svg deleted file mode 100755 index 19432d1..0000000 --- a/python/static/svg/praying-hands-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/prescription-bottle-alt-solid.svg b/python/static/svg/prescription-bottle-alt-solid.svg deleted file mode 100755 index 123ac60..0000000 --- a/python/static/svg/prescription-bottle-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/prescription-bottle-solid.svg b/python/static/svg/prescription-bottle-solid.svg deleted file mode 100755 index cc60b14..0000000 --- a/python/static/svg/prescription-bottle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/prescription-solid.svg b/python/static/svg/prescription-solid.svg deleted file mode 100755 index 4bc2159..0000000 --- a/python/static/svg/prescription-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/print-solid.svg b/python/static/svg/print-solid.svg deleted file mode 100755 index 08463f8..0000000 --- a/python/static/svg/print-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/procedures-solid.svg b/python/static/svg/procedures-solid.svg deleted file mode 100755 index c69333e..0000000 --- a/python/static/svg/procedures-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/product-hunt.svg b/python/static/svg/product-hunt.svg deleted file mode 100755 index c13fecc..0000000 --- a/python/static/svg/product-hunt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/project-diagram-solid.svg b/python/static/svg/project-diagram-solid.svg deleted file mode 100755 index 9751248..0000000 --- a/python/static/svg/project-diagram-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/pushed.svg b/python/static/svg/pushed.svg deleted file mode 100755 index d4f2a24..0000000 --- a/python/static/svg/pushed.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/puzzle-piece-solid.svg b/python/static/svg/puzzle-piece-solid.svg deleted file mode 100755 index c33c488..0000000 --- a/python/static/svg/puzzle-piece-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/python.svg b/python/static/svg/python.svg deleted file mode 100755 index edc7c6d..0000000 --- a/python/static/svg/python.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/qq.svg b/python/static/svg/qq.svg deleted file mode 100755 index 521fc00..0000000 --- a/python/static/svg/qq.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/qrcode-solid.svg b/python/static/svg/qrcode-solid.svg deleted file mode 100755 index c40bc3e..0000000 --- a/python/static/svg/qrcode-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/question-circle-solid.svg b/python/static/svg/question-circle-solid.svg deleted file mode 100755 index 2003075..0000000 --- a/python/static/svg/question-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/question-circle.svg b/python/static/svg/question-circle.svg deleted file mode 100755 index 2003075..0000000 --- a/python/static/svg/question-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/question-solid.svg b/python/static/svg/question-solid.svg deleted file mode 100755 index 58576b3..0000000 --- a/python/static/svg/question-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/quidditch-solid.svg b/python/static/svg/quidditch-solid.svg deleted file mode 100755 index 7c5257c..0000000 --- a/python/static/svg/quidditch-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/quinscape.svg b/python/static/svg/quinscape.svg deleted file mode 100755 index 38823b2..0000000 --- a/python/static/svg/quinscape.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/quora.svg b/python/static/svg/quora.svg deleted file mode 100755 index e7eb8b0..0000000 --- a/python/static/svg/quora.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/quote-left-solid.svg b/python/static/svg/quote-left-solid.svg deleted file mode 100755 index cb4ee05..0000000 --- a/python/static/svg/quote-left-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/quote-right-solid.svg b/python/static/svg/quote-right-solid.svg deleted file mode 100755 index 17f10e4..0000000 --- a/python/static/svg/quote-right-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/quran-solid.svg b/python/static/svg/quran-solid.svg deleted file mode 100755 index 3ed860f..0000000 --- a/python/static/svg/quran-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/r-project.svg b/python/static/svg/r-project.svg deleted file mode 100755 index f0aa32e..0000000 --- a/python/static/svg/r-project.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/radiation-alt-solid.svg b/python/static/svg/radiation-alt-solid.svg deleted file mode 100755 index 7543335..0000000 --- a/python/static/svg/radiation-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/radiation-solid.svg b/python/static/svg/radiation-solid.svg deleted file mode 100755 index b287d6a..0000000 --- a/python/static/svg/radiation-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rainbow-solid.svg b/python/static/svg/rainbow-solid.svg deleted file mode 100755 index 24269a6..0000000 --- a/python/static/svg/rainbow-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/random-solid.svg b/python/static/svg/random-solid.svg deleted file mode 100755 index 5384ce2..0000000 --- a/python/static/svg/random-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/raspberry-pi.svg b/python/static/svg/raspberry-pi.svg deleted file mode 100755 index b5a5e40..0000000 --- a/python/static/svg/raspberry-pi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ravelry.svg b/python/static/svg/ravelry.svg deleted file mode 100755 index d7976dc..0000000 --- a/python/static/svg/ravelry.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/react.svg b/python/static/svg/react.svg deleted file mode 100755 index e228a6f..0000000 --- a/python/static/svg/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/reacteurope.svg b/python/static/svg/reacteurope.svg deleted file mode 100755 index d2662c2..0000000 --- a/python/static/svg/reacteurope.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/readme.svg b/python/static/svg/readme.svg deleted file mode 100755 index b4fdf89..0000000 --- a/python/static/svg/readme.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rebel.svg b/python/static/svg/rebel.svg deleted file mode 100755 index 0b7d15f..0000000 --- a/python/static/svg/rebel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/receipt-solid.svg b/python/static/svg/receipt-solid.svg deleted file mode 100755 index 2f6a28a..0000000 --- a/python/static/svg/receipt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/record-vinyl-solid.svg b/python/static/svg/record-vinyl-solid.svg deleted file mode 100755 index 4e06fba..0000000 --- a/python/static/svg/record-vinyl-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/recycle-solid.svg b/python/static/svg/recycle-solid.svg deleted file mode 100755 index 913674e..0000000 --- a/python/static/svg/recycle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/red-river.svg b/python/static/svg/red-river.svg deleted file mode 100755 index e9be04f..0000000 --- a/python/static/svg/red-river.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/reddit-alien.svg b/python/static/svg/reddit-alien.svg deleted file mode 100755 index eb1b864..0000000 --- a/python/static/svg/reddit-alien.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/reddit-square.svg b/python/static/svg/reddit-square.svg deleted file mode 100755 index d78703a..0000000 --- a/python/static/svg/reddit-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/reddit.svg b/python/static/svg/reddit.svg deleted file mode 100755 index eb1b864..0000000 --- a/python/static/svg/reddit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/redhat.svg b/python/static/svg/redhat.svg deleted file mode 100755 index 22f8f6e..0000000 --- a/python/static/svg/redhat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/redo-alt-solid.svg b/python/static/svg/redo-alt-solid.svg deleted file mode 100755 index 09ff0c0..0000000 --- a/python/static/svg/redo-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/redo-solid.svg b/python/static/svg/redo-solid.svg deleted file mode 100755 index 1afb426..0000000 --- a/python/static/svg/redo-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/registered-solid.svg b/python/static/svg/registered-solid.svg deleted file mode 100755 index 82e930a..0000000 --- a/python/static/svg/registered-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/registered.svg b/python/static/svg/registered.svg deleted file mode 100755 index 82e930a..0000000 --- a/python/static/svg/registered.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/remove-format-solid.svg b/python/static/svg/remove-format-solid.svg deleted file mode 100755 index 52ea2a1..0000000 --- a/python/static/svg/remove-format-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/renren.svg b/python/static/svg/renren.svg deleted file mode 100755 index 3226d10..0000000 --- a/python/static/svg/renren.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/reply-all-solid.svg b/python/static/svg/reply-all-solid.svg deleted file mode 100755 index ecb069d..0000000 --- a/python/static/svg/reply-all-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/reply-solid.svg b/python/static/svg/reply-solid.svg deleted file mode 100755 index 964ffb5..0000000 --- a/python/static/svg/reply-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/replyd.svg b/python/static/svg/replyd.svg deleted file mode 100755 index 6283861..0000000 --- a/python/static/svg/replyd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/republican-solid.svg b/python/static/svg/republican-solid.svg deleted file mode 100755 index f594977..0000000 --- a/python/static/svg/republican-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/researchgate.svg b/python/static/svg/researchgate.svg deleted file mode 100755 index 94f2b23..0000000 --- a/python/static/svg/researchgate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/resolving.svg b/python/static/svg/resolving.svg deleted file mode 100755 index 42e7af5..0000000 --- a/python/static/svg/resolving.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/restroom-solid.svg b/python/static/svg/restroom-solid.svg deleted file mode 100755 index 0fc0658..0000000 --- a/python/static/svg/restroom-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/retweet-solid.svg b/python/static/svg/retweet-solid.svg deleted file mode 100755 index fd35fc9..0000000 --- a/python/static/svg/retweet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rev.svg b/python/static/svg/rev.svg deleted file mode 100755 index 52e15aa..0000000 --- a/python/static/svg/rev.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ribbon-solid.svg b/python/static/svg/ribbon-solid.svg deleted file mode 100755 index 95b9f95..0000000 --- a/python/static/svg/ribbon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ring-solid.svg b/python/static/svg/ring-solid.svg deleted file mode 100755 index cb28c80..0000000 --- a/python/static/svg/ring-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/road-solid.svg b/python/static/svg/road-solid.svg deleted file mode 100755 index bab3cd3..0000000 --- a/python/static/svg/road-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/robot-solid.svg b/python/static/svg/robot-solid.svg deleted file mode 100755 index 5bcb010..0000000 --- a/python/static/svg/robot-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rocket-solid.svg b/python/static/svg/rocket-solid.svg deleted file mode 100755 index bd5011f..0000000 --- a/python/static/svg/rocket-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rocketchat.svg b/python/static/svg/rocketchat.svg deleted file mode 100755 index dfa9a3a..0000000 --- a/python/static/svg/rocketchat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rockrms.svg b/python/static/svg/rockrms.svg deleted file mode 100755 index b2b3d12..0000000 --- a/python/static/svg/rockrms.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/route-solid.svg b/python/static/svg/route-solid.svg deleted file mode 100755 index cdeffee..0000000 --- a/python/static/svg/route-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rss-solid.svg b/python/static/svg/rss-solid.svg deleted file mode 100755 index ede6813..0000000 --- a/python/static/svg/rss-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rss-square-solid.svg b/python/static/svg/rss-square-solid.svg deleted file mode 100755 index cedc7cf..0000000 --- a/python/static/svg/rss-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ruble-sign-solid.svg b/python/static/svg/ruble-sign-solid.svg deleted file mode 100755 index 61350d6..0000000 --- a/python/static/svg/ruble-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ruler-combined-solid.svg b/python/static/svg/ruler-combined-solid.svg deleted file mode 100755 index 9b7312f..0000000 --- a/python/static/svg/ruler-combined-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ruler-horizontal-solid.svg b/python/static/svg/ruler-horizontal-solid.svg deleted file mode 100755 index 41ba238..0000000 --- a/python/static/svg/ruler-horizontal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ruler-solid.svg b/python/static/svg/ruler-solid.svg deleted file mode 100755 index 8d272ce..0000000 --- a/python/static/svg/ruler-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ruler-vertical-solid.svg b/python/static/svg/ruler-vertical-solid.svg deleted file mode 100755 index 9275543..0000000 --- a/python/static/svg/ruler-vertical-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/running-solid.svg b/python/static/svg/running-solid.svg deleted file mode 100755 index d0d1c6b..0000000 --- a/python/static/svg/running-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/rupee-sign-solid.svg b/python/static/svg/rupee-sign-solid.svg deleted file mode 100755 index 2b617dc..0000000 --- a/python/static/svg/rupee-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sad-cry-solid.svg b/python/static/svg/sad-cry-solid.svg deleted file mode 100755 index e168afb..0000000 --- a/python/static/svg/sad-cry-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sad-cry.svg b/python/static/svg/sad-cry.svg deleted file mode 100755 index e168afb..0000000 --- a/python/static/svg/sad-cry.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sad-tear-solid.svg b/python/static/svg/sad-tear-solid.svg deleted file mode 100755 index 322c347..0000000 --- a/python/static/svg/sad-tear-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sad-tear.svg b/python/static/svg/sad-tear.svg deleted file mode 100755 index 322c347..0000000 --- a/python/static/svg/sad-tear.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/safari.svg b/python/static/svg/safari.svg deleted file mode 100755 index 858e24e..0000000 --- a/python/static/svg/safari.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/salesforce.svg b/python/static/svg/salesforce.svg deleted file mode 100755 index 80304fe..0000000 --- a/python/static/svg/salesforce.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sass.svg b/python/static/svg/sass.svg deleted file mode 100755 index 50358e4..0000000 --- a/python/static/svg/sass.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/satellite-dish-solid.svg b/python/static/svg/satellite-dish-solid.svg deleted file mode 100755 index d8f30c7..0000000 --- a/python/static/svg/satellite-dish-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/satellite-solid.svg b/python/static/svg/satellite-solid.svg deleted file mode 100755 index c104ab9..0000000 --- a/python/static/svg/satellite-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/save-solid.svg b/python/static/svg/save-solid.svg deleted file mode 100755 index 74e0ddf..0000000 --- a/python/static/svg/save-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/save.svg b/python/static/svg/save.svg deleted file mode 100755 index 74e0ddf..0000000 --- a/python/static/svg/save.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/schlix.svg b/python/static/svg/schlix.svg deleted file mode 100755 index d721832..0000000 --- a/python/static/svg/schlix.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/school-solid.svg b/python/static/svg/school-solid.svg deleted file mode 100755 index b407d26..0000000 --- a/python/static/svg/school-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/screwdriver-solid.svg b/python/static/svg/screwdriver-solid.svg deleted file mode 100755 index ce1a280..0000000 --- a/python/static/svg/screwdriver-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/scribd.svg b/python/static/svg/scribd.svg deleted file mode 100755 index 958e86e..0000000 --- a/python/static/svg/scribd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/scroll-solid.svg b/python/static/svg/scroll-solid.svg deleted file mode 100755 index 252bbd9..0000000 --- a/python/static/svg/scroll-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sd-card-solid.svg b/python/static/svg/sd-card-solid.svg deleted file mode 100755 index 8b80137..0000000 --- a/python/static/svg/sd-card-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/search-dollar-solid.svg b/python/static/svg/search-dollar-solid.svg deleted file mode 100755 index bb268a5..0000000 --- a/python/static/svg/search-dollar-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/search-location-solid.svg b/python/static/svg/search-location-solid.svg deleted file mode 100755 index 1ad180d..0000000 --- a/python/static/svg/search-location-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/search-minus-solid.svg b/python/static/svg/search-minus-solid.svg deleted file mode 100755 index 2d1e15b..0000000 --- a/python/static/svg/search-minus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/search-plus-solid.svg b/python/static/svg/search-plus-solid.svg deleted file mode 100755 index 90fd482..0000000 --- a/python/static/svg/search-plus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/search-solid.svg b/python/static/svg/search-solid.svg deleted file mode 100755 index 47ae557..0000000 --- a/python/static/svg/search-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/searchengin.svg b/python/static/svg/searchengin.svg deleted file mode 100755 index f265914..0000000 --- a/python/static/svg/searchengin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/seedling-solid.svg b/python/static/svg/seedling-solid.svg deleted file mode 100755 index fdebe42..0000000 --- a/python/static/svg/seedling-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sellcast.svg b/python/static/svg/sellcast.svg deleted file mode 100755 index 1971bfe..0000000 --- a/python/static/svg/sellcast.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sellsy.svg b/python/static/svg/sellsy.svg deleted file mode 100755 index 3b0b71c..0000000 --- a/python/static/svg/sellsy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/server-solid.svg b/python/static/svg/server-solid.svg deleted file mode 100755 index 83165f3..0000000 --- a/python/static/svg/server-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/servicestack.svg b/python/static/svg/servicestack.svg deleted file mode 100755 index 9975c9f..0000000 --- a/python/static/svg/servicestack.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shapes-solid.svg b/python/static/svg/shapes-solid.svg deleted file mode 100755 index 052cd5e..0000000 --- a/python/static/svg/shapes-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/share-alt-solid.svg b/python/static/svg/share-alt-solid.svg deleted file mode 100755 index 7d0fe95..0000000 --- a/python/static/svg/share-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/share-alt-square-solid.svg b/python/static/svg/share-alt-square-solid.svg deleted file mode 100755 index 95ec11a..0000000 --- a/python/static/svg/share-alt-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/share-solid.svg b/python/static/svg/share-solid.svg deleted file mode 100755 index 26b66c9..0000000 --- a/python/static/svg/share-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/share-square-solid.svg b/python/static/svg/share-square-solid.svg deleted file mode 100755 index 2f2f352..0000000 --- a/python/static/svg/share-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/share-square.svg b/python/static/svg/share-square.svg deleted file mode 100755 index 2f2f352..0000000 --- a/python/static/svg/share-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shekel-sign-solid.svg b/python/static/svg/shekel-sign-solid.svg deleted file mode 100755 index 15db28b..0000000 --- a/python/static/svg/shekel-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shield-alt-solid.svg b/python/static/svg/shield-alt-solid.svg deleted file mode 100755 index 4eb2a3e..0000000 --- a/python/static/svg/shield-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ship-solid.svg b/python/static/svg/ship-solid.svg deleted file mode 100755 index 6088b5d..0000000 --- a/python/static/svg/ship-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shipping-fast-solid.svg b/python/static/svg/shipping-fast-solid.svg deleted file mode 100755 index 23244ab..0000000 --- a/python/static/svg/shipping-fast-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shirtsinbulk.svg b/python/static/svg/shirtsinbulk.svg deleted file mode 100755 index 8454d01..0000000 --- a/python/static/svg/shirtsinbulk.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shoe-prints-solid.svg b/python/static/svg/shoe-prints-solid.svg deleted file mode 100755 index 7d79dab..0000000 --- a/python/static/svg/shoe-prints-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shopping-bag-solid.svg b/python/static/svg/shopping-bag-solid.svg deleted file mode 100755 index 9262e37..0000000 --- a/python/static/svg/shopping-bag-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shopping-basket-solid.svg b/python/static/svg/shopping-basket-solid.svg deleted file mode 100755 index b5af48a..0000000 --- a/python/static/svg/shopping-basket-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shopping-cart-solid.svg b/python/static/svg/shopping-cart-solid.svg deleted file mode 100755 index d0b9136..0000000 --- a/python/static/svg/shopping-cart-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shopware.svg b/python/static/svg/shopware.svg deleted file mode 100755 index fd2168d..0000000 --- a/python/static/svg/shopware.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shower-solid.svg b/python/static/svg/shower-solid.svg deleted file mode 100755 index 6e2700d..0000000 --- a/python/static/svg/shower-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/shuttle-van-solid.svg b/python/static/svg/shuttle-van-solid.svg deleted file mode 100755 index a7b24ed..0000000 --- a/python/static/svg/shuttle-van-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sign-in-alt-solid.svg b/python/static/svg/sign-in-alt-solid.svg deleted file mode 100755 index b3fa6af..0000000 --- a/python/static/svg/sign-in-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sign-language-solid.svg b/python/static/svg/sign-language-solid.svg deleted file mode 100755 index 1eeee29..0000000 --- a/python/static/svg/sign-language-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sign-out-alt-solid.svg b/python/static/svg/sign-out-alt-solid.svg deleted file mode 100755 index 1b38f26..0000000 --- a/python/static/svg/sign-out-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sign-solid.svg b/python/static/svg/sign-solid.svg deleted file mode 100755 index a470835..0000000 --- a/python/static/svg/sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/signal-solid.svg b/python/static/svg/signal-solid.svg deleted file mode 100755 index 3f03e49..0000000 --- a/python/static/svg/signal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/signature-solid.svg b/python/static/svg/signature-solid.svg deleted file mode 100755 index f78c6e7..0000000 --- a/python/static/svg/signature-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sim-card-solid.svg b/python/static/svg/sim-card-solid.svg deleted file mode 100755 index 76dc980..0000000 --- a/python/static/svg/sim-card-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/simplybuilt.svg b/python/static/svg/simplybuilt.svg deleted file mode 100755 index f5d16f2..0000000 --- a/python/static/svg/simplybuilt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sistrix.svg b/python/static/svg/sistrix.svg deleted file mode 100755 index 872956d..0000000 --- a/python/static/svg/sistrix.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sitemap-solid.svg b/python/static/svg/sitemap-solid.svg deleted file mode 100755 index c8142af..0000000 --- a/python/static/svg/sitemap-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sith.svg b/python/static/svg/sith.svg deleted file mode 100755 index f045432..0000000 --- a/python/static/svg/sith.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/skating-solid.svg b/python/static/svg/skating-solid.svg deleted file mode 100755 index c2a601b..0000000 --- a/python/static/svg/skating-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sketch.svg b/python/static/svg/sketch.svg deleted file mode 100755 index 98d3e10..0000000 --- a/python/static/svg/sketch.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/skiing-nordic-solid.svg b/python/static/svg/skiing-nordic-solid.svg deleted file mode 100755 index 91827c1..0000000 --- a/python/static/svg/skiing-nordic-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/skiing-solid.svg b/python/static/svg/skiing-solid.svg deleted file mode 100755 index bea9d53..0000000 --- a/python/static/svg/skiing-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/skull-crossbones-solid.svg b/python/static/svg/skull-crossbones-solid.svg deleted file mode 100755 index 0ad61c1..0000000 --- a/python/static/svg/skull-crossbones-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/skull-solid.svg b/python/static/svg/skull-solid.svg deleted file mode 100755 index 4cbedd0..0000000 --- a/python/static/svg/skull-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/skyatlas.svg b/python/static/svg/skyatlas.svg deleted file mode 100755 index 3710ba2..0000000 --- a/python/static/svg/skyatlas.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/skype.svg b/python/static/svg/skype.svg deleted file mode 100755 index 317f0e6..0000000 --- a/python/static/svg/skype.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/slack-hash.svg b/python/static/svg/slack-hash.svg deleted file mode 100755 index 7bc106a..0000000 --- a/python/static/svg/slack-hash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/slack.svg b/python/static/svg/slack.svg deleted file mode 100755 index 7bc106a..0000000 --- a/python/static/svg/slack.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/slash-solid.svg b/python/static/svg/slash-solid.svg deleted file mode 100755 index 77ad77b..0000000 --- a/python/static/svg/slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sleigh-solid.svg b/python/static/svg/sleigh-solid.svg deleted file mode 100755 index dc33a03..0000000 --- a/python/static/svg/sleigh-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sliders-h-solid.svg b/python/static/svg/sliders-h-solid.svg deleted file mode 100755 index 178447e..0000000 --- a/python/static/svg/sliders-h-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/slideshare.svg b/python/static/svg/slideshare.svg deleted file mode 100755 index 3366260..0000000 --- a/python/static/svg/slideshare.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smile-beam-solid.svg b/python/static/svg/smile-beam-solid.svg deleted file mode 100755 index 13afc39..0000000 --- a/python/static/svg/smile-beam-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smile-beam.svg b/python/static/svg/smile-beam.svg deleted file mode 100755 index 13afc39..0000000 --- a/python/static/svg/smile-beam.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smile-solid.svg b/python/static/svg/smile-solid.svg deleted file mode 100755 index 0ff7ed2..0000000 --- a/python/static/svg/smile-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smile-wink-solid.svg b/python/static/svg/smile-wink-solid.svg deleted file mode 100755 index 4e35cbf..0000000 --- a/python/static/svg/smile-wink-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smile-wink.svg b/python/static/svg/smile-wink.svg deleted file mode 100755 index 4e35cbf..0000000 --- a/python/static/svg/smile-wink.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smile.svg b/python/static/svg/smile.svg deleted file mode 100755 index 0ff7ed2..0000000 --- a/python/static/svg/smile.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smog-solid.svg b/python/static/svg/smog-solid.svg deleted file mode 100755 index 13e4710..0000000 --- a/python/static/svg/smog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smoking-ban-solid.svg b/python/static/svg/smoking-ban-solid.svg deleted file mode 100755 index 29227b2..0000000 --- a/python/static/svg/smoking-ban-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/smoking-solid.svg b/python/static/svg/smoking-solid.svg deleted file mode 100755 index 8b3ed20..0000000 --- a/python/static/svg/smoking-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sms-solid.svg b/python/static/svg/sms-solid.svg deleted file mode 100755 index 4a33283..0000000 --- a/python/static/svg/sms-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snapchat-ghost.svg b/python/static/svg/snapchat-ghost.svg deleted file mode 100755 index aa57d3e..0000000 --- a/python/static/svg/snapchat-ghost.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snapchat-square.svg b/python/static/svg/snapchat-square.svg deleted file mode 100755 index 2668063..0000000 --- a/python/static/svg/snapchat-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snapchat.svg b/python/static/svg/snapchat.svg deleted file mode 100755 index aa57d3e..0000000 --- a/python/static/svg/snapchat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snowboarding-solid.svg b/python/static/svg/snowboarding-solid.svg deleted file mode 100755 index 085abd5..0000000 --- a/python/static/svg/snowboarding-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snowflake-solid.svg b/python/static/svg/snowflake-solid.svg deleted file mode 100755 index b569349..0000000 --- a/python/static/svg/snowflake-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snowflake.svg b/python/static/svg/snowflake.svg deleted file mode 100755 index b569349..0000000 --- a/python/static/svg/snowflake.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snowman-solid.svg b/python/static/svg/snowman-solid.svg deleted file mode 100755 index 8950088..0000000 --- a/python/static/svg/snowman-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/snowplow-solid.svg b/python/static/svg/snowplow-solid.svg deleted file mode 100755 index 38d85f0..0000000 --- a/python/static/svg/snowplow-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/socks-solid.svg b/python/static/svg/socks-solid.svg deleted file mode 100755 index a2c61ee..0000000 --- a/python/static/svg/socks-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/solar-panel-solid.svg b/python/static/svg/solar-panel-solid.svg deleted file mode 100755 index 309ae3b..0000000 --- a/python/static/svg/solar-panel-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-alpha-down-alt-solid.svg b/python/static/svg/sort-alpha-down-alt-solid.svg deleted file mode 100755 index 44dd6eb..0000000 --- a/python/static/svg/sort-alpha-down-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-alpha-down-solid.svg b/python/static/svg/sort-alpha-down-solid.svg deleted file mode 100755 index 513adb3..0000000 --- a/python/static/svg/sort-alpha-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-alpha-up-alt-solid.svg b/python/static/svg/sort-alpha-up-alt-solid.svg deleted file mode 100755 index ef087ac..0000000 --- a/python/static/svg/sort-alpha-up-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-alpha-up-solid.svg b/python/static/svg/sort-alpha-up-solid.svg deleted file mode 100755 index 366ac6b..0000000 --- a/python/static/svg/sort-alpha-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-amount-down-alt-solid.svg b/python/static/svg/sort-amount-down-alt-solid.svg deleted file mode 100755 index 56ecf45..0000000 --- a/python/static/svg/sort-amount-down-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-amount-down-solid.svg b/python/static/svg/sort-amount-down-solid.svg deleted file mode 100755 index a95464b..0000000 --- a/python/static/svg/sort-amount-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-amount-up-alt-solid.svg b/python/static/svg/sort-amount-up-alt-solid.svg deleted file mode 100755 index c1487a7..0000000 --- a/python/static/svg/sort-amount-up-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-amount-up-solid.svg b/python/static/svg/sort-amount-up-solid.svg deleted file mode 100755 index 2d59a9e..0000000 --- a/python/static/svg/sort-amount-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-down-solid.svg b/python/static/svg/sort-down-solid.svg deleted file mode 100755 index 5b0db34..0000000 --- a/python/static/svg/sort-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-numeric-down-alt-solid.svg b/python/static/svg/sort-numeric-down-alt-solid.svg deleted file mode 100755 index 246750a..0000000 --- a/python/static/svg/sort-numeric-down-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-numeric-down-solid.svg b/python/static/svg/sort-numeric-down-solid.svg deleted file mode 100755 index d734093..0000000 --- a/python/static/svg/sort-numeric-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-numeric-up-alt-solid.svg b/python/static/svg/sort-numeric-up-alt-solid.svg deleted file mode 100755 index d1a89c8..0000000 --- a/python/static/svg/sort-numeric-up-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-numeric-up-solid.svg b/python/static/svg/sort-numeric-up-solid.svg deleted file mode 100755 index 2477420..0000000 --- a/python/static/svg/sort-numeric-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-solid.svg b/python/static/svg/sort-solid.svg deleted file mode 100755 index 82eef83..0000000 --- a/python/static/svg/sort-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sort-up-solid.svg b/python/static/svg/sort-up-solid.svg deleted file mode 100755 index 9e096ba..0000000 --- a/python/static/svg/sort-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/soundcloud.svg b/python/static/svg/soundcloud.svg deleted file mode 100755 index dd1999e..0000000 --- a/python/static/svg/soundcloud.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sourcetree.svg b/python/static/svg/sourcetree.svg deleted file mode 100755 index 675fc96..0000000 --- a/python/static/svg/sourcetree.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/spa-solid.svg b/python/static/svg/spa-solid.svg deleted file mode 100755 index f26942f..0000000 --- a/python/static/svg/spa-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/space-shuttle-solid.svg b/python/static/svg/space-shuttle-solid.svg deleted file mode 100755 index 8c3df24..0000000 --- a/python/static/svg/space-shuttle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/speakap.svg b/python/static/svg/speakap.svg deleted file mode 100755 index aade2c0..0000000 --- a/python/static/svg/speakap.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/speaker-deck.svg b/python/static/svg/speaker-deck.svg deleted file mode 100755 index 510d999..0000000 --- a/python/static/svg/speaker-deck.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/spell-check-solid.svg b/python/static/svg/spell-check-solid.svg deleted file mode 100755 index 1cbbd5d..0000000 --- a/python/static/svg/spell-check-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/spider-solid.svg b/python/static/svg/spider-solid.svg deleted file mode 100755 index e06b859..0000000 --- a/python/static/svg/spider-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/spinner-solid.svg b/python/static/svg/spinner-solid.svg deleted file mode 100755 index 2de6acb..0000000 --- a/python/static/svg/spinner-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/splotch-solid.svg b/python/static/svg/splotch-solid.svg deleted file mode 100755 index b32352f..0000000 --- a/python/static/svg/splotch-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/spotify.svg b/python/static/svg/spotify.svg deleted file mode 100755 index e7b5aba..0000000 --- a/python/static/svg/spotify.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/spray-can-solid.svg b/python/static/svg/spray-can-solid.svg deleted file mode 100755 index 4d050e9..0000000 --- a/python/static/svg/spray-can-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/square-full-solid.svg b/python/static/svg/square-full-solid.svg deleted file mode 100755 index 927f15b..0000000 --- a/python/static/svg/square-full-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/square-root-alt-solid.svg b/python/static/svg/square-root-alt-solid.svg deleted file mode 100755 index cb0262d..0000000 --- a/python/static/svg/square-root-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/square-solid.svg b/python/static/svg/square-solid.svg deleted file mode 100755 index 927f15b..0000000 --- a/python/static/svg/square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/square.svg b/python/static/svg/square.svg deleted file mode 100755 index 9f1bad8..0000000 --- a/python/static/svg/square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/squarespace.svg b/python/static/svg/squarespace.svg deleted file mode 100755 index f3d1004..0000000 --- a/python/static/svg/squarespace.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stack-exchange.svg b/python/static/svg/stack-exchange.svg deleted file mode 100755 index 6d7ca7a..0000000 --- a/python/static/svg/stack-exchange.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stack-overflow.svg b/python/static/svg/stack-overflow.svg deleted file mode 100755 index 173fa66..0000000 --- a/python/static/svg/stack-overflow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stackpath.svg b/python/static/svg/stackpath.svg deleted file mode 100755 index e86f73f..0000000 --- a/python/static/svg/stackpath.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stamp-solid.svg b/python/static/svg/stamp-solid.svg deleted file mode 100755 index 42e51a9..0000000 --- a/python/static/svg/stamp-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star-and-crescent-solid.svg b/python/static/svg/star-and-crescent-solid.svg deleted file mode 100755 index 342900f..0000000 --- a/python/static/svg/star-and-crescent-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star-half-alt-solid.svg b/python/static/svg/star-half-alt-solid.svg deleted file mode 100755 index 3151fba..0000000 --- a/python/static/svg/star-half-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star-half-solid.svg b/python/static/svg/star-half-solid.svg deleted file mode 100755 index 3ae1c33..0000000 --- a/python/static/svg/star-half-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star-half.svg b/python/static/svg/star-half.svg deleted file mode 100755 index 3ae1c33..0000000 --- a/python/static/svg/star-half.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star-of-david-solid.svg b/python/static/svg/star-of-david-solid.svg deleted file mode 100755 index 5d30baf..0000000 --- a/python/static/svg/star-of-david-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star-of-life-solid.svg b/python/static/svg/star-of-life-solid.svg deleted file mode 100755 index 9b7d6fd..0000000 --- a/python/static/svg/star-of-life-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star-solid.svg b/python/static/svg/star-solid.svg deleted file mode 100755 index eae25c6..0000000 --- a/python/static/svg/star-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/star.svg b/python/static/svg/star.svg deleted file mode 100755 index 55be877..0000000 --- a/python/static/svg/star.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/staylinked.svg b/python/static/svg/staylinked.svg deleted file mode 100755 index ecea071..0000000 --- a/python/static/svg/staylinked.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/steam-square.svg b/python/static/svg/steam-square.svg deleted file mode 100755 index 3ef61c6..0000000 --- a/python/static/svg/steam-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/steam-symbol.svg b/python/static/svg/steam-symbol.svg deleted file mode 100755 index 12c797b..0000000 --- a/python/static/svg/steam-symbol.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/steam.svg b/python/static/svg/steam.svg deleted file mode 100755 index 7343c2d..0000000 --- a/python/static/svg/steam.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/step-backward-solid.svg b/python/static/svg/step-backward-solid.svg deleted file mode 100755 index 0a9f809..0000000 --- a/python/static/svg/step-backward-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/step-forward-solid.svg b/python/static/svg/step-forward-solid.svg deleted file mode 100755 index ebc6dac..0000000 --- a/python/static/svg/step-forward-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stethoscope-solid.svg b/python/static/svg/stethoscope-solid.svg deleted file mode 100755 index 3118429..0000000 --- a/python/static/svg/stethoscope-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sticker-mule.svg b/python/static/svg/sticker-mule.svg deleted file mode 100755 index 43fe287..0000000 --- a/python/static/svg/sticker-mule.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sticky-note-solid.svg b/python/static/svg/sticky-note-solid.svg deleted file mode 100755 index 9dc111f..0000000 --- a/python/static/svg/sticky-note-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sticky-note.svg b/python/static/svg/sticky-note.svg deleted file mode 100755 index 9dc111f..0000000 --- a/python/static/svg/sticky-note.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stop-circle-solid.svg b/python/static/svg/stop-circle-solid.svg deleted file mode 100755 index 073eb82..0000000 --- a/python/static/svg/stop-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stop-circle.svg b/python/static/svg/stop-circle.svg deleted file mode 100755 index 073eb82..0000000 --- a/python/static/svg/stop-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stop-solid.svg b/python/static/svg/stop-solid.svg deleted file mode 100755 index 9f1bad8..0000000 --- a/python/static/svg/stop-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stopwatch-solid.svg b/python/static/svg/stopwatch-solid.svg deleted file mode 100755 index 5c49984..0000000 --- a/python/static/svg/stopwatch-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/store-alt-solid.svg b/python/static/svg/store-alt-solid.svg deleted file mode 100755 index 347cf25..0000000 --- a/python/static/svg/store-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/store-solid.svg b/python/static/svg/store-solid.svg deleted file mode 100755 index a0a6819..0000000 --- a/python/static/svg/store-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/strava.svg b/python/static/svg/strava.svg deleted file mode 100755 index 0879619..0000000 --- a/python/static/svg/strava.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stream-solid.svg b/python/static/svg/stream-solid.svg deleted file mode 100755 index 9a3911e..0000000 --- a/python/static/svg/stream-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/street-view-solid.svg b/python/static/svg/street-view-solid.svg deleted file mode 100755 index bff1065..0000000 --- a/python/static/svg/street-view-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/strikethrough-solid.svg b/python/static/svg/strikethrough-solid.svg deleted file mode 100755 index 61d40cc..0000000 --- a/python/static/svg/strikethrough-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stripe-s.svg b/python/static/svg/stripe-s.svg deleted file mode 100755 index 399f16e..0000000 --- a/python/static/svg/stripe-s.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stripe.svg b/python/static/svg/stripe.svg deleted file mode 100755 index 69ad5a5..0000000 --- a/python/static/svg/stripe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stroopwafel-solid.svg b/python/static/svg/stroopwafel-solid.svg deleted file mode 100755 index a0645ba..0000000 --- a/python/static/svg/stroopwafel-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/studiovinari.svg b/python/static/svg/studiovinari.svg deleted file mode 100755 index 3741e6a..0000000 --- a/python/static/svg/studiovinari.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stumbleupon-circle.svg b/python/static/svg/stumbleupon-circle.svg deleted file mode 100755 index 7ead6e0..0000000 --- a/python/static/svg/stumbleupon-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/stumbleupon.svg b/python/static/svg/stumbleupon.svg deleted file mode 100755 index 907acf3..0000000 --- a/python/static/svg/stumbleupon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/subscript-solid.svg b/python/static/svg/subscript-solid.svg deleted file mode 100755 index cc70041..0000000 --- a/python/static/svg/subscript-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/subway-solid.svg b/python/static/svg/subway-solid.svg deleted file mode 100755 index 6ad8899..0000000 --- a/python/static/svg/subway-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/suitcase-rolling-solid.svg b/python/static/svg/suitcase-rolling-solid.svg deleted file mode 100755 index c6551e2..0000000 --- a/python/static/svg/suitcase-rolling-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/suitcase-solid.svg b/python/static/svg/suitcase-solid.svg deleted file mode 100755 index af9f3f4..0000000 --- a/python/static/svg/suitcase-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sun-solid.svg b/python/static/svg/sun-solid.svg deleted file mode 100755 index 3b784bd..0000000 --- a/python/static/svg/sun-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sun.svg b/python/static/svg/sun.svg deleted file mode 100755 index 3b784bd..0000000 --- a/python/static/svg/sun.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/superpowers.svg b/python/static/svg/superpowers.svg deleted file mode 100755 index 347f9a0..0000000 --- a/python/static/svg/superpowers.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/superscript-solid.svg b/python/static/svg/superscript-solid.svg deleted file mode 100755 index bfb512c..0000000 --- a/python/static/svg/superscript-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/supple.svg b/python/static/svg/supple.svg deleted file mode 100755 index 78973ad..0000000 --- a/python/static/svg/supple.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/surprise-solid.svg b/python/static/svg/surprise-solid.svg deleted file mode 100755 index b06dbae..0000000 --- a/python/static/svg/surprise-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/surprise.svg b/python/static/svg/surprise.svg deleted file mode 100755 index b06dbae..0000000 --- a/python/static/svg/surprise.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/suse.svg b/python/static/svg/suse.svg deleted file mode 100755 index a0483cc..0000000 --- a/python/static/svg/suse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/swatchbook-solid.svg b/python/static/svg/swatchbook-solid.svg deleted file mode 100755 index 5837648..0000000 --- a/python/static/svg/swatchbook-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/swift.svg b/python/static/svg/swift.svg deleted file mode 100755 index c8ad512..0000000 --- a/python/static/svg/swift.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/swimmer-solid.svg b/python/static/svg/swimmer-solid.svg deleted file mode 100755 index b624acc..0000000 --- a/python/static/svg/swimmer-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/swimming-pool-solid.svg b/python/static/svg/swimming-pool-solid.svg deleted file mode 100755 index cbd1fac..0000000 --- a/python/static/svg/swimming-pool-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/symfony.svg b/python/static/svg/symfony.svg deleted file mode 100755 index 39fd0ef..0000000 --- a/python/static/svg/symfony.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/synagogue-solid.svg b/python/static/svg/synagogue-solid.svg deleted file mode 100755 index 0c1f7b4..0000000 --- a/python/static/svg/synagogue-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sync-alt-solid.svg b/python/static/svg/sync-alt-solid.svg deleted file mode 100755 index 9cf6098..0000000 --- a/python/static/svg/sync-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/sync-solid.svg b/python/static/svg/sync-solid.svg deleted file mode 100755 index 9cf6098..0000000 --- a/python/static/svg/sync-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/syringe-solid.svg b/python/static/svg/syringe-solid.svg deleted file mode 100755 index 26e1cd5..0000000 --- a/python/static/svg/syringe-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/table-solid.svg b/python/static/svg/table-solid.svg deleted file mode 100755 index 51f2bec..0000000 --- a/python/static/svg/table-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/table-tennis-solid.svg b/python/static/svg/table-tennis-solid.svg deleted file mode 100755 index d28dc63..0000000 --- a/python/static/svg/table-tennis-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tablet-alt-solid.svg b/python/static/svg/tablet-alt-solid.svg deleted file mode 100755 index a1075ab..0000000 --- a/python/static/svg/tablet-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tablet-solid.svg b/python/static/svg/tablet-solid.svg deleted file mode 100755 index a1075ab..0000000 --- a/python/static/svg/tablet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tablets-solid.svg b/python/static/svg/tablets-solid.svg deleted file mode 100755 index 9c5f9d0..0000000 --- a/python/static/svg/tablets-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tachometer-alt-solid.svg b/python/static/svg/tachometer-alt-solid.svg deleted file mode 100755 index 6880990..0000000 --- a/python/static/svg/tachometer-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tag-solid.svg b/python/static/svg/tag-solid.svg deleted file mode 100755 index 8f2c0d2..0000000 --- a/python/static/svg/tag-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tags-solid.svg b/python/static/svg/tags-solid.svg deleted file mode 100755 index fa0dbcd..0000000 --- a/python/static/svg/tags-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tape-solid.svg b/python/static/svg/tape-solid.svg deleted file mode 100755 index 3283a2b..0000000 --- a/python/static/svg/tape-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tasks-solid.svg b/python/static/svg/tasks-solid.svg deleted file mode 100755 index f74184c..0000000 --- a/python/static/svg/tasks-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/taxi-solid.svg b/python/static/svg/taxi-solid.svg deleted file mode 100755 index 348bd43..0000000 --- a/python/static/svg/taxi-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/teamspeak.svg b/python/static/svg/teamspeak.svg deleted file mode 100755 index 7d40e44..0000000 --- a/python/static/svg/teamspeak.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/teeth-open-solid.svg b/python/static/svg/teeth-open-solid.svg deleted file mode 100755 index 7e38a56..0000000 --- a/python/static/svg/teeth-open-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/teeth-solid.svg b/python/static/svg/teeth-solid.svg deleted file mode 100755 index 6fdc6da..0000000 --- a/python/static/svg/teeth-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/telegram-plane.svg b/python/static/svg/telegram-plane.svg deleted file mode 100755 index ee9d532..0000000 --- a/python/static/svg/telegram-plane.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/telegram.svg b/python/static/svg/telegram.svg deleted file mode 100755 index ee9d532..0000000 --- a/python/static/svg/telegram.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/temperature-high-solid.svg b/python/static/svg/temperature-high-solid.svg deleted file mode 100755 index 29795eb..0000000 --- a/python/static/svg/temperature-high-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/temperature-low-solid.svg b/python/static/svg/temperature-low-solid.svg deleted file mode 100755 index b9532b2..0000000 --- a/python/static/svg/temperature-low-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tencent-weibo.svg b/python/static/svg/tencent-weibo.svg deleted file mode 100755 index 39aa16c..0000000 --- a/python/static/svg/tencent-weibo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tenge-solid.svg b/python/static/svg/tenge-solid.svg deleted file mode 100755 index 1e95a15..0000000 --- a/python/static/svg/tenge-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/terminal-solid.svg b/python/static/svg/terminal-solid.svg deleted file mode 100755 index 46e3bc1..0000000 --- a/python/static/svg/terminal-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/text-height-solid.svg b/python/static/svg/text-height-solid.svg deleted file mode 100755 index 61e23d1..0000000 --- a/python/static/svg/text-height-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/text-width-solid.svg b/python/static/svg/text-width-solid.svg deleted file mode 100755 index 23a9700..0000000 --- a/python/static/svg/text-width-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/th-large-solid.svg b/python/static/svg/th-large-solid.svg deleted file mode 100755 index e7237ac..0000000 --- a/python/static/svg/th-large-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/th-list-solid.svg b/python/static/svg/th-list-solid.svg deleted file mode 100755 index 11a775e..0000000 --- a/python/static/svg/th-list-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/th-solid.svg b/python/static/svg/th-solid.svg deleted file mode 100755 index 24cfc64..0000000 --- a/python/static/svg/th-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/the-red-yeti.svg b/python/static/svg/the-red-yeti.svg deleted file mode 100755 index 12e5a3e..0000000 --- a/python/static/svg/the-red-yeti.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/theater-masks-solid.svg b/python/static/svg/theater-masks-solid.svg deleted file mode 100755 index 5e18e57..0000000 --- a/python/static/svg/theater-masks-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/themeco.svg b/python/static/svg/themeco.svg deleted file mode 100755 index 824f399..0000000 --- a/python/static/svg/themeco.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/themeisle.svg b/python/static/svg/themeisle.svg deleted file mode 100755 index 74dce5e..0000000 --- a/python/static/svg/themeisle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thermometer-empty-solid.svg b/python/static/svg/thermometer-empty-solid.svg deleted file mode 100755 index 199de7b..0000000 --- a/python/static/svg/thermometer-empty-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thermometer-full-solid.svg b/python/static/svg/thermometer-full-solid.svg deleted file mode 100755 index d06b406..0000000 --- a/python/static/svg/thermometer-full-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thermometer-half-solid.svg b/python/static/svg/thermometer-half-solid.svg deleted file mode 100755 index 0fdd58a..0000000 --- a/python/static/svg/thermometer-half-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thermometer-quarter-solid.svg b/python/static/svg/thermometer-quarter-solid.svg deleted file mode 100755 index f95588e..0000000 --- a/python/static/svg/thermometer-quarter-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thermometer-solid.svg b/python/static/svg/thermometer-solid.svg deleted file mode 100755 index ef8cfe1..0000000 --- a/python/static/svg/thermometer-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thermometer-three-quarters-solid.svg b/python/static/svg/thermometer-three-quarters-solid.svg deleted file mode 100755 index cdefa83..0000000 --- a/python/static/svg/thermometer-three-quarters-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/think-peaks.svg b/python/static/svg/think-peaks.svg deleted file mode 100755 index 601f3c1..0000000 --- a/python/static/svg/think-peaks.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thumbs-down-solid.svg b/python/static/svg/thumbs-down-solid.svg deleted file mode 100755 index 0da1748..0000000 --- a/python/static/svg/thumbs-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thumbs-down.svg b/python/static/svg/thumbs-down.svg deleted file mode 100755 index 0da1748..0000000 --- a/python/static/svg/thumbs-down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thumbs-up-solid.svg b/python/static/svg/thumbs-up-solid.svg deleted file mode 100755 index 39e629e..0000000 --- a/python/static/svg/thumbs-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thumbs-up.svg b/python/static/svg/thumbs-up.svg deleted file mode 100755 index 39e629e..0000000 --- a/python/static/svg/thumbs-up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/thumbtack-solid.svg b/python/static/svg/thumbtack-solid.svg deleted file mode 100755 index 2a13a3c..0000000 --- a/python/static/svg/thumbtack-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ticket-alt-solid.svg b/python/static/svg/ticket-alt-solid.svg deleted file mode 100755 index 945c5cd..0000000 --- a/python/static/svg/ticket-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/times-circle-solid.svg b/python/static/svg/times-circle-solid.svg deleted file mode 100755 index 5ee3fc3..0000000 --- a/python/static/svg/times-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/times-circle.svg b/python/static/svg/times-circle.svg deleted file mode 100755 index 5ee3fc3..0000000 --- a/python/static/svg/times-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/times-solid.svg b/python/static/svg/times-solid.svg deleted file mode 100755 index 3605fbf..0000000 --- a/python/static/svg/times-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tint-slash-solid.svg b/python/static/svg/tint-slash-solid.svg deleted file mode 100755 index b5196dd..0000000 --- a/python/static/svg/tint-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tint-solid.svg b/python/static/svg/tint-solid.svg deleted file mode 100755 index 32cdd96..0000000 --- a/python/static/svg/tint-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tired-solid.svg b/python/static/svg/tired-solid.svg deleted file mode 100755 index 55da27a..0000000 --- a/python/static/svg/tired-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tired.svg b/python/static/svg/tired.svg deleted file mode 100755 index 55da27a..0000000 --- a/python/static/svg/tired.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/toggle-off-solid.svg b/python/static/svg/toggle-off-solid.svg deleted file mode 100755 index 64af2db..0000000 --- a/python/static/svg/toggle-off-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/toggle-on-solid.svg b/python/static/svg/toggle-on-solid.svg deleted file mode 100755 index dbcff4e..0000000 --- a/python/static/svg/toggle-on-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/toilet-paper-solid.svg b/python/static/svg/toilet-paper-solid.svg deleted file mode 100755 index fc3c571..0000000 --- a/python/static/svg/toilet-paper-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/toilet-solid.svg b/python/static/svg/toilet-solid.svg deleted file mode 100755 index 10a0fd9..0000000 --- a/python/static/svg/toilet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/toolbox-solid.svg b/python/static/svg/toolbox-solid.svg deleted file mode 100755 index dd86879..0000000 --- a/python/static/svg/toolbox-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tools-solid.svg b/python/static/svg/tools-solid.svg deleted file mode 100755 index c73b1b8..0000000 --- a/python/static/svg/tools-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tooth-solid.svg b/python/static/svg/tooth-solid.svg deleted file mode 100755 index e764c97..0000000 --- a/python/static/svg/tooth-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/torah-solid.svg b/python/static/svg/torah-solid.svg deleted file mode 100755 index 8eea09f..0000000 --- a/python/static/svg/torah-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/torii-gate-solid.svg b/python/static/svg/torii-gate-solid.svg deleted file mode 100755 index b589d9e..0000000 --- a/python/static/svg/torii-gate-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tractor-solid.svg b/python/static/svg/tractor-solid.svg deleted file mode 100755 index cc8078d..0000000 --- a/python/static/svg/tractor-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trade-federation.svg b/python/static/svg/trade-federation.svg deleted file mode 100755 index bb64206..0000000 --- a/python/static/svg/trade-federation.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trademark-solid.svg b/python/static/svg/trademark-solid.svg deleted file mode 100755 index d0d79b7..0000000 --- a/python/static/svg/trademark-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/traffic-light-solid.svg b/python/static/svg/traffic-light-solid.svg deleted file mode 100755 index 576369e..0000000 --- a/python/static/svg/traffic-light-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/train-solid.svg b/python/static/svg/train-solid.svg deleted file mode 100755 index 852bf00..0000000 --- a/python/static/svg/train-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tram-solid.svg b/python/static/svg/tram-solid.svg deleted file mode 100755 index 79aa01d..0000000 --- a/python/static/svg/tram-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/transgender-alt-solid.svg b/python/static/svg/transgender-alt-solid.svg deleted file mode 100755 index 5e4310c..0000000 --- a/python/static/svg/transgender-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/transgender-solid.svg b/python/static/svg/transgender-solid.svg deleted file mode 100755 index 8472da4..0000000 --- a/python/static/svg/transgender-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trash-alt-solid.svg b/python/static/svg/trash-alt-solid.svg deleted file mode 100755 index 8bd63bb..0000000 --- a/python/static/svg/trash-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trash-alt.svg b/python/static/svg/trash-alt.svg deleted file mode 100755 index 8bd63bb..0000000 --- a/python/static/svg/trash-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trash-restore-alt-solid.svg b/python/static/svg/trash-restore-alt-solid.svg deleted file mode 100755 index 8a6d9c7..0000000 --- a/python/static/svg/trash-restore-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trash-restore-solid.svg b/python/static/svg/trash-restore-solid.svg deleted file mode 100755 index c4eb50d..0000000 --- a/python/static/svg/trash-restore-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trash-solid.svg b/python/static/svg/trash-solid.svg deleted file mode 100755 index 75f1eae..0000000 --- a/python/static/svg/trash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tree-solid.svg b/python/static/svg/tree-solid.svg deleted file mode 100755 index 881725b..0000000 --- a/python/static/svg/tree-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trello.svg b/python/static/svg/trello.svg deleted file mode 100755 index 9b525c0..0000000 --- a/python/static/svg/trello.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tripadvisor.svg b/python/static/svg/tripadvisor.svg deleted file mode 100755 index dff8401..0000000 --- a/python/static/svg/tripadvisor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/trophy-solid.svg b/python/static/svg/trophy-solid.svg deleted file mode 100755 index 4f15c84..0000000 --- a/python/static/svg/trophy-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/truck-loading-solid.svg b/python/static/svg/truck-loading-solid.svg deleted file mode 100755 index 8b67a92..0000000 --- a/python/static/svg/truck-loading-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/truck-monster-solid.svg b/python/static/svg/truck-monster-solid.svg deleted file mode 100755 index 1b16bcb..0000000 --- a/python/static/svg/truck-monster-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/truck-moving-solid.svg b/python/static/svg/truck-moving-solid.svg deleted file mode 100755 index 293b2ed..0000000 --- a/python/static/svg/truck-moving-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/truck-pickup-solid.svg b/python/static/svg/truck-pickup-solid.svg deleted file mode 100755 index b19ca67..0000000 --- a/python/static/svg/truck-pickup-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/truck-solid.svg b/python/static/svg/truck-solid.svg deleted file mode 100755 index 293b2ed..0000000 --- a/python/static/svg/truck-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tshirt-solid.svg b/python/static/svg/tshirt-solid.svg deleted file mode 100755 index d770819..0000000 --- a/python/static/svg/tshirt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tty-solid.svg b/python/static/svg/tty-solid.svg deleted file mode 100755 index 7de981d..0000000 --- a/python/static/svg/tty-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tumblr-square.svg b/python/static/svg/tumblr-square.svg deleted file mode 100755 index ce18de0..0000000 --- a/python/static/svg/tumblr-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tumblr.svg b/python/static/svg/tumblr.svg deleted file mode 100755 index 41b0244..0000000 --- a/python/static/svg/tumblr.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/tv-solid.svg b/python/static/svg/tv-solid.svg deleted file mode 100755 index 3a29476..0000000 --- a/python/static/svg/tv-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/twitch.svg b/python/static/svg/twitch.svg deleted file mode 100755 index adfcea3..0000000 --- a/python/static/svg/twitch.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/twitter-square.svg b/python/static/svg/twitter-square.svg deleted file mode 100755 index d1c7a06..0000000 --- a/python/static/svg/twitter-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/twitter.svg b/python/static/svg/twitter.svg deleted file mode 100755 index b368e73..0000000 --- a/python/static/svg/twitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/typo3.svg b/python/static/svg/typo3.svg deleted file mode 100755 index 74b54a8..0000000 --- a/python/static/svg/typo3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/uber.svg b/python/static/svg/uber.svg deleted file mode 100755 index e605578..0000000 --- a/python/static/svg/uber.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ubuntu.svg b/python/static/svg/ubuntu.svg deleted file mode 100755 index 6b8af73..0000000 --- a/python/static/svg/ubuntu.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/uikit.svg b/python/static/svg/uikit.svg deleted file mode 100755 index 4825268..0000000 --- a/python/static/svg/uikit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/umbraco.svg b/python/static/svg/umbraco.svg deleted file mode 100755 index d2148fa..0000000 --- a/python/static/svg/umbraco.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/umbrella-beach-solid.svg b/python/static/svg/umbrella-beach-solid.svg deleted file mode 100755 index 31d1771..0000000 --- a/python/static/svg/umbrella-beach-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/umbrella-solid.svg b/python/static/svg/umbrella-solid.svg deleted file mode 100755 index 3b55ffc..0000000 --- a/python/static/svg/umbrella-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/underline-solid.svg b/python/static/svg/underline-solid.svg deleted file mode 100755 index 6f3cc98..0000000 --- a/python/static/svg/underline-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/undo-alt-solid.svg b/python/static/svg/undo-alt-solid.svg deleted file mode 100755 index ff20c89..0000000 --- a/python/static/svg/undo-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/undo-solid.svg b/python/static/svg/undo-solid.svg deleted file mode 100755 index f49d590..0000000 --- a/python/static/svg/undo-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/uniregistry.svg b/python/static/svg/uniregistry.svg deleted file mode 100755 index 5f71302..0000000 --- a/python/static/svg/uniregistry.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/universal-access-solid.svg b/python/static/svg/universal-access-solid.svg deleted file mode 100755 index 8ee1d0b..0000000 --- a/python/static/svg/universal-access-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/university-solid.svg b/python/static/svg/university-solid.svg deleted file mode 100755 index b0e01bd..0000000 --- a/python/static/svg/university-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/unlink-solid.svg b/python/static/svg/unlink-solid.svg deleted file mode 100755 index f267dbb..0000000 --- a/python/static/svg/unlink-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/unlock-alt-solid.svg b/python/static/svg/unlock-alt-solid.svg deleted file mode 100755 index 469e510..0000000 --- a/python/static/svg/unlock-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/unlock-solid.svg b/python/static/svg/unlock-solid.svg deleted file mode 100755 index d2517a5..0000000 --- a/python/static/svg/unlock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/untappd.svg b/python/static/svg/untappd.svg deleted file mode 100755 index 00851b5..0000000 --- a/python/static/svg/untappd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/upload-solid.svg b/python/static/svg/upload-solid.svg deleted file mode 100755 index 1fab921..0000000 --- a/python/static/svg/upload-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ups.svg b/python/static/svg/ups.svg deleted file mode 100755 index 5afec32..0000000 --- a/python/static/svg/ups.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/usb.svg b/python/static/svg/usb.svg deleted file mode 100755 index 1b4bfcd..0000000 --- a/python/static/svg/usb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-alt-slash-solid.svg b/python/static/svg/user-alt-slash-solid.svg deleted file mode 100755 index 9e980f6..0000000 --- a/python/static/svg/user-alt-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-alt-solid.svg b/python/static/svg/user-alt-solid.svg deleted file mode 100755 index 28399d0..0000000 --- a/python/static/svg/user-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-astronaut-solid.svg b/python/static/svg/user-astronaut-solid.svg deleted file mode 100755 index 87c9619..0000000 --- a/python/static/svg/user-astronaut-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-check-solid.svg b/python/static/svg/user-check-solid.svg deleted file mode 100755 index d681565..0000000 --- a/python/static/svg/user-check-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-circle-solid.svg b/python/static/svg/user-circle-solid.svg deleted file mode 100755 index 83ec938..0000000 --- a/python/static/svg/user-circle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-circle.svg b/python/static/svg/user-circle.svg deleted file mode 100755 index 83ec938..0000000 --- a/python/static/svg/user-circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-clock-solid.svg b/python/static/svg/user-clock-solid.svg deleted file mode 100755 index 723d923..0000000 --- a/python/static/svg/user-clock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-cog-solid.svg b/python/static/svg/user-cog-solid.svg deleted file mode 100755 index 7ec523f..0000000 --- a/python/static/svg/user-cog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-edit-solid.svg b/python/static/svg/user-edit-solid.svg deleted file mode 100755 index c17271f..0000000 --- a/python/static/svg/user-edit-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-friends-solid.svg b/python/static/svg/user-friends-solid.svg deleted file mode 100755 index c880686..0000000 --- a/python/static/svg/user-friends-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-graduate-solid.svg b/python/static/svg/user-graduate-solid.svg deleted file mode 100755 index 3aa683f..0000000 --- a/python/static/svg/user-graduate-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-injured-solid.svg b/python/static/svg/user-injured-solid.svg deleted file mode 100755 index ae190d2..0000000 --- a/python/static/svg/user-injured-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-lock-solid.svg b/python/static/svg/user-lock-solid.svg deleted file mode 100755 index 6fb7a93..0000000 --- a/python/static/svg/user-lock-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-md-solid.svg b/python/static/svg/user-md-solid.svg deleted file mode 100755 index 83285f0..0000000 --- a/python/static/svg/user-md-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-minus-solid.svg b/python/static/svg/user-minus-solid.svg deleted file mode 100755 index 0fae8cf..0000000 --- a/python/static/svg/user-minus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-ninja-solid.svg b/python/static/svg/user-ninja-solid.svg deleted file mode 100755 index 10f784e..0000000 --- a/python/static/svg/user-ninja-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-nurse-solid.svg b/python/static/svg/user-nurse-solid.svg deleted file mode 100755 index 2b1aef9..0000000 --- a/python/static/svg/user-nurse-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-plus-solid.svg b/python/static/svg/user-plus-solid.svg deleted file mode 100755 index 840278b..0000000 --- a/python/static/svg/user-plus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-secret-solid.svg b/python/static/svg/user-secret-solid.svg deleted file mode 100755 index 1342e5e..0000000 --- a/python/static/svg/user-secret-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-shield-solid.svg b/python/static/svg/user-shield-solid.svg deleted file mode 100755 index 28f7ab6..0000000 --- a/python/static/svg/user-shield-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-slash-solid.svg b/python/static/svg/user-slash-solid.svg deleted file mode 100755 index f5caac9..0000000 --- a/python/static/svg/user-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-solid.svg b/python/static/svg/user-solid.svg deleted file mode 100755 index 3fba0aa..0000000 --- a/python/static/svg/user-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-tag-solid.svg b/python/static/svg/user-tag-solid.svg deleted file mode 100755 index 79a014b..0000000 --- a/python/static/svg/user-tag-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-tie-solid.svg b/python/static/svg/user-tie-solid.svg deleted file mode 100755 index 66d5b5a..0000000 --- a/python/static/svg/user-tie-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user-times-solid.svg b/python/static/svg/user-times-solid.svg deleted file mode 100755 index b9a7773..0000000 --- a/python/static/svg/user-times-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/user.svg b/python/static/svg/user.svg deleted file mode 100755 index 3fba0aa..0000000 --- a/python/static/svg/user.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/users-cog-solid.svg b/python/static/svg/users-cog-solid.svg deleted file mode 100755 index 4d592dc..0000000 --- a/python/static/svg/users-cog-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/users-solid.svg b/python/static/svg/users-solid.svg deleted file mode 100755 index d190dbf..0000000 --- a/python/static/svg/users-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/usps.svg b/python/static/svg/usps.svg deleted file mode 100755 index 9aa21d9..0000000 --- a/python/static/svg/usps.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/ussunnah.svg b/python/static/svg/ussunnah.svg deleted file mode 100755 index 02791a6..0000000 --- a/python/static/svg/ussunnah.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/utensil-spoon-solid.svg b/python/static/svg/utensil-spoon-solid.svg deleted file mode 100755 index 0d02396..0000000 --- a/python/static/svg/utensil-spoon-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/utensils-solid.svg b/python/static/svg/utensils-solid.svg deleted file mode 100755 index 9b719ce..0000000 --- a/python/static/svg/utensils-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vaadin.svg b/python/static/svg/vaadin.svg deleted file mode 100755 index 9efd240..0000000 --- a/python/static/svg/vaadin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vector-square-solid.svg b/python/static/svg/vector-square-solid.svg deleted file mode 100755 index 9dfbec9..0000000 --- a/python/static/svg/vector-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/venus-double-solid.svg b/python/static/svg/venus-double-solid.svg deleted file mode 100755 index da35acd..0000000 --- a/python/static/svg/venus-double-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/venus-mars-solid.svg b/python/static/svg/venus-mars-solid.svg deleted file mode 100755 index befd0ee..0000000 --- a/python/static/svg/venus-mars-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/venus-solid.svg b/python/static/svg/venus-solid.svg deleted file mode 100755 index e623c62..0000000 --- a/python/static/svg/venus-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/viacoin.svg b/python/static/svg/viacoin.svg deleted file mode 100755 index 625ef5b..0000000 --- a/python/static/svg/viacoin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/viadeo-square.svg b/python/static/svg/viadeo-square.svg deleted file mode 100755 index 753bd89..0000000 --- a/python/static/svg/viadeo-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/viadeo.svg b/python/static/svg/viadeo.svg deleted file mode 100755 index 50d010e..0000000 --- a/python/static/svg/viadeo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vial-solid.svg b/python/static/svg/vial-solid.svg deleted file mode 100755 index 183c249..0000000 --- a/python/static/svg/vial-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vials-solid.svg b/python/static/svg/vials-solid.svg deleted file mode 100755 index 4ae630f..0000000 --- a/python/static/svg/vials-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/viber.svg b/python/static/svg/viber.svg deleted file mode 100755 index c20ebf5..0000000 --- a/python/static/svg/viber.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/video-slash-solid.svg b/python/static/svg/video-slash-solid.svg deleted file mode 100755 index 6c9b90f..0000000 --- a/python/static/svg/video-slash-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/video-solid.svg b/python/static/svg/video-solid.svg deleted file mode 100755 index 19c0242..0000000 --- a/python/static/svg/video-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vihara-solid.svg b/python/static/svg/vihara-solid.svg deleted file mode 100755 index 2268f8a..0000000 --- a/python/static/svg/vihara-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vimeo-square.svg b/python/static/svg/vimeo-square.svg deleted file mode 100755 index 30b7bf4..0000000 --- a/python/static/svg/vimeo-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vimeo-v.svg b/python/static/svg/vimeo-v.svg deleted file mode 100755 index 7b58d18..0000000 --- a/python/static/svg/vimeo-v.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vimeo.svg b/python/static/svg/vimeo.svg deleted file mode 100755 index 7b58d18..0000000 --- a/python/static/svg/vimeo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vine.svg b/python/static/svg/vine.svg deleted file mode 100755 index 1174924..0000000 --- a/python/static/svg/vine.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vk.svg b/python/static/svg/vk.svg deleted file mode 100755 index 5fd4483..0000000 --- a/python/static/svg/vk.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vnv.svg b/python/static/svg/vnv.svg deleted file mode 100755 index e449977..0000000 --- a/python/static/svg/vnv.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/voicemail-solid.svg b/python/static/svg/voicemail-solid.svg deleted file mode 100755 index a641235..0000000 --- a/python/static/svg/voicemail-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/volleyball-ball-solid.svg b/python/static/svg/volleyball-ball-solid.svg deleted file mode 100755 index ae63a59..0000000 --- a/python/static/svg/volleyball-ball-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/volume-down-solid.svg b/python/static/svg/volume-down-solid.svg deleted file mode 100755 index 92b3d5f..0000000 --- a/python/static/svg/volume-down-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/volume-mute-solid.svg b/python/static/svg/volume-mute-solid.svg deleted file mode 100755 index 220ac94..0000000 --- a/python/static/svg/volume-mute-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/volume-off-solid.svg b/python/static/svg/volume-off-solid.svg deleted file mode 100755 index 220ac94..0000000 --- a/python/static/svg/volume-off-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/volume-up-solid.svg b/python/static/svg/volume-up-solid.svg deleted file mode 100755 index 296f443..0000000 --- a/python/static/svg/volume-up-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vote-yea-solid.svg b/python/static/svg/vote-yea-solid.svg deleted file mode 100755 index 3bf6d71..0000000 --- a/python/static/svg/vote-yea-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vr-cardboard-solid.svg b/python/static/svg/vr-cardboard-solid.svg deleted file mode 100755 index 033a43a..0000000 --- a/python/static/svg/vr-cardboard-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/vuejs.svg b/python/static/svg/vuejs.svg deleted file mode 100755 index afe6243..0000000 --- a/python/static/svg/vuejs.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/walking-solid.svg b/python/static/svg/walking-solid.svg deleted file mode 100755 index c2574e0..0000000 --- a/python/static/svg/walking-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wallet-solid.svg b/python/static/svg/wallet-solid.svg deleted file mode 100755 index 404c3df..0000000 --- a/python/static/svg/wallet-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/warehouse-solid.svg b/python/static/svg/warehouse-solid.svg deleted file mode 100755 index e6ace69..0000000 --- a/python/static/svg/warehouse-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/water-solid.svg b/python/static/svg/water-solid.svg deleted file mode 100755 index 9eaaaa6..0000000 --- a/python/static/svg/water-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wave-square-solid.svg b/python/static/svg/wave-square-solid.svg deleted file mode 100755 index a3218a3..0000000 --- a/python/static/svg/wave-square-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/waze.svg b/python/static/svg/waze.svg deleted file mode 100755 index 224f183..0000000 --- a/python/static/svg/waze.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/weebly.svg b/python/static/svg/weebly.svg deleted file mode 100755 index 6b24395..0000000 --- a/python/static/svg/weebly.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/weibo.svg b/python/static/svg/weibo.svg deleted file mode 100755 index 54becbc..0000000 --- a/python/static/svg/weibo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/weight-hanging-solid.svg b/python/static/svg/weight-hanging-solid.svg deleted file mode 100755 index 98dd9cd..0000000 --- a/python/static/svg/weight-hanging-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/weight-solid.svg b/python/static/svg/weight-solid.svg deleted file mode 100755 index f13c5c2..0000000 --- a/python/static/svg/weight-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/weixin.svg b/python/static/svg/weixin.svg deleted file mode 100755 index 1fd4582..0000000 --- a/python/static/svg/weixin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/whatsapp-square.svg b/python/static/svg/whatsapp-square.svg deleted file mode 100755 index c4c398a..0000000 --- a/python/static/svg/whatsapp-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/whatsapp.svg b/python/static/svg/whatsapp.svg deleted file mode 100755 index 499cfba..0000000 --- a/python/static/svg/whatsapp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wheelchair-solid.svg b/python/static/svg/wheelchair-solid.svg deleted file mode 100755 index 45359fc..0000000 --- a/python/static/svg/wheelchair-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/whmcs.svg b/python/static/svg/whmcs.svg deleted file mode 100755 index e0c5e77..0000000 --- a/python/static/svg/whmcs.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wifi-solid.svg b/python/static/svg/wifi-solid.svg deleted file mode 100755 index f0bf74c..0000000 --- a/python/static/svg/wifi-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wikipedia-w.svg b/python/static/svg/wikipedia-w.svg deleted file mode 100755 index 751ca63..0000000 --- a/python/static/svg/wikipedia-w.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wind-solid.svg b/python/static/svg/wind-solid.svg deleted file mode 100755 index 6825874..0000000 --- a/python/static/svg/wind-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-close-solid.svg b/python/static/svg/window-close-solid.svg deleted file mode 100755 index 576586c..0000000 --- a/python/static/svg/window-close-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-close.svg b/python/static/svg/window-close.svg deleted file mode 100755 index 576586c..0000000 --- a/python/static/svg/window-close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-maximize-solid.svg b/python/static/svg/window-maximize-solid.svg deleted file mode 100755 index 8ff0ee8..0000000 --- a/python/static/svg/window-maximize-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-maximize.svg b/python/static/svg/window-maximize.svg deleted file mode 100755 index 8ff0ee8..0000000 --- a/python/static/svg/window-maximize.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-minimize-solid.svg b/python/static/svg/window-minimize-solid.svg deleted file mode 100755 index c71ca88..0000000 --- a/python/static/svg/window-minimize-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-minimize.svg b/python/static/svg/window-minimize.svg deleted file mode 100755 index c71ca88..0000000 --- a/python/static/svg/window-minimize.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-restore-solid.svg b/python/static/svg/window-restore-solid.svg deleted file mode 100755 index bcea8f4..0000000 --- a/python/static/svg/window-restore-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/window-restore.svg b/python/static/svg/window-restore.svg deleted file mode 100755 index bcea8f4..0000000 --- a/python/static/svg/window-restore.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/windows.svg b/python/static/svg/windows.svg deleted file mode 100755 index c26a23c..0000000 --- a/python/static/svg/windows.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wine-bottle-solid.svg b/python/static/svg/wine-bottle-solid.svg deleted file mode 100755 index 916d81b..0000000 --- a/python/static/svg/wine-bottle-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wine-glass-alt-solid.svg b/python/static/svg/wine-glass-alt-solid.svg deleted file mode 100755 index d686f39..0000000 --- a/python/static/svg/wine-glass-alt-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wine-glass-solid.svg b/python/static/svg/wine-glass-solid.svg deleted file mode 100755 index a60e791..0000000 --- a/python/static/svg/wine-glass-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wix.svg b/python/static/svg/wix.svg deleted file mode 100755 index 02688d5..0000000 --- a/python/static/svg/wix.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wizards-of-the-coast.svg b/python/static/svg/wizards-of-the-coast.svg deleted file mode 100755 index 319e22d..0000000 --- a/python/static/svg/wizards-of-the-coast.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wolf-pack-battalion.svg b/python/static/svg/wolf-pack-battalion.svg deleted file mode 100755 index 1bfe768..0000000 --- a/python/static/svg/wolf-pack-battalion.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/won-sign-solid.svg b/python/static/svg/won-sign-solid.svg deleted file mode 100755 index 4751990..0000000 --- a/python/static/svg/won-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wordpress-simple.svg b/python/static/svg/wordpress-simple.svg deleted file mode 100755 index 8a00a2c..0000000 --- a/python/static/svg/wordpress-simple.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wordpress.svg b/python/static/svg/wordpress.svg deleted file mode 100755 index 286aad8..0000000 --- a/python/static/svg/wordpress.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wpbeginner.svg b/python/static/svg/wpbeginner.svg deleted file mode 100755 index f94353c..0000000 --- a/python/static/svg/wpbeginner.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wpexplorer.svg b/python/static/svg/wpexplorer.svg deleted file mode 100755 index d6a3e36..0000000 --- a/python/static/svg/wpexplorer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wpforms.svg b/python/static/svg/wpforms.svg deleted file mode 100755 index a0c480d..0000000 --- a/python/static/svg/wpforms.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wpressr.svg b/python/static/svg/wpressr.svg deleted file mode 100755 index cd16550..0000000 --- a/python/static/svg/wpressr.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/wrench-solid.svg b/python/static/svg/wrench-solid.svg deleted file mode 100755 index 90fbe7b..0000000 --- a/python/static/svg/wrench-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/x-ray-solid.svg b/python/static/svg/x-ray-solid.svg deleted file mode 100755 index c729036..0000000 --- a/python/static/svg/x-ray-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/xbox.svg b/python/static/svg/xbox.svg deleted file mode 100755 index e030166..0000000 --- a/python/static/svg/xbox.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/xing-square.svg b/python/static/svg/xing-square.svg deleted file mode 100755 index c3d2447..0000000 --- a/python/static/svg/xing-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/xing.svg b/python/static/svg/xing.svg deleted file mode 100755 index e8b35f2..0000000 --- a/python/static/svg/xing.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/y-combinator.svg b/python/static/svg/y-combinator.svg deleted file mode 100755 index 78fba50..0000000 --- a/python/static/svg/y-combinator.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yahoo.svg b/python/static/svg/yahoo.svg deleted file mode 100755 index e24e453..0000000 --- a/python/static/svg/yahoo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yammer.svg b/python/static/svg/yammer.svg deleted file mode 100755 index 4611b06..0000000 --- a/python/static/svg/yammer.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yandex-international.svg b/python/static/svg/yandex-international.svg deleted file mode 100755 index 059f76a..0000000 --- a/python/static/svg/yandex-international.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yandex.svg b/python/static/svg/yandex.svg deleted file mode 100755 index 7479e10..0000000 --- a/python/static/svg/yandex.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yarn.svg b/python/static/svg/yarn.svg deleted file mode 100755 index e5fa4c1..0000000 --- a/python/static/svg/yarn.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yelp.svg b/python/static/svg/yelp.svg deleted file mode 100755 index 27f5c23..0000000 --- a/python/static/svg/yelp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yen-sign-solid.svg b/python/static/svg/yen-sign-solid.svg deleted file mode 100755 index 168dfc8..0000000 --- a/python/static/svg/yen-sign-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yin-yang-solid.svg b/python/static/svg/yin-yang-solid.svg deleted file mode 100755 index 55d1fcd..0000000 --- a/python/static/svg/yin-yang-solid.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/yoast.svg b/python/static/svg/yoast.svg deleted file mode 100755 index fcf47b6..0000000 --- a/python/static/svg/yoast.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/youtube-square.svg b/python/static/svg/youtube-square.svg deleted file mode 100755 index 2d17852..0000000 --- a/python/static/svg/youtube-square.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/youtube.svg b/python/static/svg/youtube.svg deleted file mode 100755 index 1766c67..0000000 --- a/python/static/svg/youtube.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/static/svg/zhihu.svg b/python/static/svg/zhihu.svg deleted file mode 100755 index 7577b92..0000000 --- a/python/static/svg/zhihu.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/python/templates/base.html b/python/templates/base.html deleted file mode 100644 index 589b12d..0000000 --- a/python/templates/base.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - getDiscography - - - - - - - - - - - - - - -

-
- -

Loading..

-
-
- -
-
-
-
- -
- - - - - - - - -
- -
-
-
- -
- - - -
-

Enter an Artist

-
- - -
-
- -
-
- - - - Download - -
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - \ No newline at end of file diff --git a/python/templates/download.html b/python/templates/download.html deleted file mode 100644 index 7097f26..0000000 --- a/python/templates/download.html +++ /dev/null @@ -1 +0,0 @@ -

{{ artist }}

diff --git a/python/templates/download_queue.html b/python/templates/download_queue.html deleted file mode 100644 index e69de29..0000000 diff --git a/python/utils/__init__.py b/python/utils/__init__.py index f4a54f8..42b1ba6 100644 --- a/python/utils/__init__.py +++ b/python/utils/__init__.py @@ -1,5 +1,2 @@ -from . import browser from . import download -from . import processor -from . import scraper from . import yt_dlp_logger diff --git a/python/utils/browser.py b/python/utils/browser.py deleted file mode 100644 index 208799a..0000000 --- a/python/utils/browser.py +++ /dev/null @@ -1,21 +0,0 @@ -from const import CWD -from seleniumrequests import Firefox -from selenium.webdriver.firefox.options import Options - - -def new_browser(headless=True): - options = Options() - options.add_argument("--window-size=1920,1080") - if headless: - options.headless = True - # options.add_argument('--headless') - try: - # See if the driver is on path - browser = Firefox(options=options, executable_path='/usr/local/bin/geckodriver') - except: - # Get the dist folder as a backup - browser = Firefox(options=options, executable_path=CWD + '/drivers/geckodriver-0.33.0/dist/geckodriver.exe') - - else: - browser = Firefox(options=options) - return browser diff --git a/python/utils/processor.py b/python/utils/processor.py deleted file mode 100644 index 16112fb..0000000 --- a/python/utils/processor.py +++ /dev/null @@ -1,54 +0,0 @@ -from database import Model -from .scraper import scrape, process_scraped_data -from pysondb import PysonDB - - -# db = PysonDB('/home/stonesoft/Apps/getDiscography/database/db.json') -Album = Model('album') - - -def filter_data_list(albums_data_list): - """ - Ensure there are no duplicate entries or cover-less entries (Intermittent issue when scrape runs) - :param albums_data_list: A list of dicts that was processed after scrape() - :return: A clean list of dicts - """ - processed_albums_data_list = [] - processed_album_names = [] - # Eliminate duplicate entries: - for item in albums_data_list: - if item.get('cover') and item.get('album') not in processed_album_names: - processed_albums_data_list.append(item) - processed_album_names.append(item.get('album')) - - return processed_albums_data_list - - -def process_download(artist): - """ - Main entrypoint for job processing - :param artist: - :return: - """ - artist = artist.title() - res = {'status': 801, 'message': 'Could not find artist %s' % artist} - # Initialize a new browser object to go collect the data we need - try: - scrape_data = scrape(artist) - if scrape_data: - albums_data_list = process_scraped_data(artist, scrape_data) - processed_albums_data_list = filter_data_list(albums_data_list) - if len(processed_albums_data_list) == 1: - Album.create(processed_albums_data_list) - else: - Album.create_many(processed_albums_data_list) - - res.update({ - 'status': 200, - 'data': processed_albums_data_list, - 'message': 'Artist %s added to the download queue!' % artist - }) - except Exception as e: - print(e) - - return res diff --git a/python/utils/scraper.py b/python/utils/scraper.py deleted file mode 100644 index c9a79c9..0000000 --- a/python/utils/scraper.py +++ /dev/null @@ -1,80 +0,0 @@ -import bs4 -import time - -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.common.by import By -from .browser import new_browser -from const import * - - -def process_scraped_data(artist, res_value): - # Process the gathered HTML data for list of data - html = bs4.BeautifulSoup(res_value, features="html.parser") - albums = html.find_all('a') - albums_data_list = [] - for album in albums: - album_data = { - 'artist': artist.title(), - 'downloaded': False, - 'downloading': False, - } - if album.has_key('href'): - album_data.update({'link': album['href']}) - - album_image = album.find('img') - if album_image and album_image.has_key('src'): - album_data.update({'cover': album_image['src']}) - - album_title = album.find('div', {'id': 'card-title'}) - if album_title and hasattr(album_title, 'text'): - album_data.update({'album': album_title.text.replace('\n', '').replace('/', '-')}) - - albums_data_list.append(album_data) - - return albums_data_list - - -def scrape(artist): - browser = new_browser(headless=True) - url = QUERY_URL + artist - browser.maximize_window() - browser.implicitly_wait(1) - response = browser.get(url) - last_height = browser.execute_script("return document.body.scrollHeight") - browser.execute_script("window.scrollTo(0, 500);") - time.sleep(1) - scrape_data = '' - - try: - # get the financial value when it's populated to the page - value_element = WebDriverWait(browser, 10).until( - EC.presence_of_element_located(locator=(By.XPATH, '//div[@id="shelf-container"]')) - ) - element = browser.find_element(By.XPATH, ALBUM_CONTAINER_ITEMS_XPATH) - if element: - time.sleep(1) - scrape_data += element.get_attribute('outerHTML') - btn_right = browser.find_element(By.XPATH, BTN_RIGHT_FULL_XPATH) - btn_right_displayed = True - safety_index = 0 - while btn_right_displayed: - # actions = ActionChains(browser) - # actions.move_to_element(btn_right).perform() - safety_index += 1 - time.sleep(1) - browser.execute_script(click_script) - time.sleep(1) - element = browser.find_element(By.XPATH, ALBUM_CONTAINER_ITEMS_XPATH) - scrape_data += element.get_attribute('outerHTML') - time.sleep(1) - btn_right_displayed = btn_right.is_displayed() - if safety_index > 5: - btn_right_displayed = False - time.sleep(1) - - finally: - # after 10 seconds, give up - browser.quit() - - return scrape_data diff --git a/python/utils/yt-links.py b/python/utils/yt-links.py deleted file mode 100644 index 8be558e..0000000 --- a/python/utils/yt-links.py +++ /dev/null @@ -1,60 +0,0 @@ -from selenium import webdriver -from selenium.webdriver.chrome.service import Service -from selenium.webdriver.common.by import By -import time -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC - -options = webdriver.ChromeOptions() -# All are optional -options.add_experimental_option("detach", True) -options.add_argument("--disable-extensions") -options.add_argument("--disable-notifications") -options.add_argument("--disable-Advertisement") -options.add_argument("--disable-popup-blocking") -options.add_argument("start-maximized") - -s = Service('./chromedriver') -driver = webdriver.Chrome(service=s, options=options) - -driver.get('https://www.youtube.com/wendoverproductions/videos') -time.sleep(3) - -item = [] -SCROLL_PAUSE_TIME = 1 -last_height = driver.execute_script("return document.documentElement.scrollHeight") - -item_count = 180 - -while item_count > len(item): - driver.execute_script("window.scrollTo(0,document.documentElement.scrollHeight);") - time.sleep(SCROLL_PAUSE_TIME) - new_height = driver.execute_script("return document.documentElement.scrollHeight") - - if new_height == last_height: - break - last_height = new_height - -data = [] -try: - for e in WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div#details'))): - title = e.find_element(By.CSS_SELECTOR, 'a#video-title-link').get_attribute('title') - vurl = e.find_element(By.CSS_SELECTOR, 'a#video-title-link').get_attribute('href') - views = e.find_element(By.XPATH, - './/*[@id="metadata"]//span[@class="inline-metadata-item style-scope ytd-video-meta-block"][1]').text - date_time = e.find_element(By.XPATH, - './/*[@id="metadata"]//span[@class="inline-metadata-item style-scope ytd-video-meta-block"][2]').text - data.append({ - 'video_url': vurl, - 'title': title, - 'date_time': date_time, - 'views': views - }) -except: - pass - -item = data -print(item) -print(len(item)) -# df = pd.DataFrame(item) -# print(df) \ No newline at end of file