├── .gitignore ├── Dockerfile ├── LICENSE.txt ├── README.md ├── conf ├── .gitkeep └── diffido.conf ├── diffido.py ├── dist ├── base.html ├── diff.html ├── history.html ├── index.html ├── schedule.html └── static │ ├── css │ ├── diff2html.css │ ├── diff2html.min.css │ ├── themes │ │ └── default.css │ └── vue-material.min.css │ ├── iconfont │ ├── MaterialIcons-Regular.eot │ ├── MaterialIcons-Regular.ijmap │ ├── MaterialIcons-Regular.svg │ ├── MaterialIcons-Regular.ttf │ ├── MaterialIcons-Regular.woff │ ├── MaterialIcons-Regular.woff2 │ ├── README.md │ ├── codepoints │ └── material-icons.css │ └── js │ ├── axios.min.js │ ├── diff2html.js │ ├── diff2html.min.js │ ├── lodash.min.js │ ├── vue-material.min.js │ ├── vue.js │ └── vue.min.js ├── docs └── DEVELOPMENT.md ├── run-docker.sh ├── ssl └── .gitkeep └── storage └── .gitkeep /.gitignore: -------------------------------------------------------------------------------- 1 | conf/*.json 2 | conf/*.db 3 | .DS_Store 4 | node_modules/ 5 | __pycache__ 6 | storage/* 7 | npm-debug*.log 8 | ssl/*.pem 9 | *.py[cod] 10 | *.so 11 | .editorconfig 12 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine 2 | LABEL \ 3 | maintainer="Davide Alberani " 4 | 5 | EXPOSE 3210 6 | 7 | RUN \ 8 | apk add --update \ 9 | git \ 10 | py3-lxml \ 11 | py3-pip \ 12 | py3-requests \ 13 | py3-sqlalchemy \ 14 | py3-tornado \ 15 | && pip3 install apscheduler \ 16 | && rm -rf /var/cache/apk/* 17 | 18 | VOLUME /diffido/conf /diffido/storage 19 | 20 | COPY diffido.py /diffido/ 21 | COPY dist /diffido/dist/ 22 | COPY ssl /diffido/ssl/ 23 | 24 | WORKDIR /diffido/ 25 | 26 | ENTRYPOINT ["./diffido.py"] 27 | 28 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Diffido 2 | 3 | Spot the difference on the web. 4 | 5 | Tired of clicking F5 waiting for a change on a web page? Define a list of pages to watch, and receive an email when something has changed. 6 | 7 | 8 | ## Install, run, develop and debug 9 | 10 | ## Docker 11 | 12 | Just run: 13 | 14 | ./run-docker.sh 15 | 16 | 17 | ## Old-fashioned installation 18 | 19 | To install it: 20 | ``` bash 21 | wget https://bootstrap.pypa.io/get-pip.py 22 | sudo python3 get-pip.py 23 | # if you want to install these modules for an unprivileged user, add --user and remove "sudo"; 24 | # if you want to upgrade the versions already present in the system, also add --upgrade 25 | sudo pip3 install lxml 26 | sudo pip3 install pytz 27 | sudo pip3 install apscheduler 28 | sudo pip3 install requests 29 | sudo pip3 install sqlalchemy 30 | sudo pip3 install tornado 31 | git clone https://github.com/alberanid/diffido 32 | cd diffido 33 | ./diffido.py --debug 34 | ``` 35 | 36 | Now you can **point your browser to [http://localhost:3210/](http://localhost:3210/)** 37 | 38 | You can also **run the server in https**, putting in the *ssl* directory two files named *diffido_key.pem* and *diffido_cert.pem* 39 | 40 | 41 | # Settings 42 | 43 | You can edit the *conf/diffido.conf* file (Python syntax) to change the global settings; you almost surely have to configure the SMTP settings, at least. 44 | 45 | Each schedule has its own web page GUI; the settings should be pretty self-explanatory, except: 46 | 47 | - **XPath selector**: define which portion of a web page to consider 48 | - **minimum change**: float between 0.0 and 1.0, which represent the minimum amount of the page (in percentage of number of lines) that has to be changed to send a notification; if left empty, any change will be notified 49 | - **crontab**: a complete crontab definition, to specify the period of the check 50 | 51 | 52 | # Development 53 | 54 | See the *docs/DEVELOPMENT.md* file for more information about how to contribute. 55 | 56 | 57 | ## Technological stack 58 | 59 | - [VueJS 2](https://vuejs.org/) for the webApp 60 | - [Vue Material](https://vuematerial.github.io/) for the UI components 61 | - [Tornado web](http://www.tornadoweb.org/) as web server 62 | - [APScheduler](https://github.com/agronholm/apscheduler) to run the scheduled jobs 63 | - [Python 3](https://www.python.org/) 64 | - [Git](https://git-scm.com/) to store the data 65 | 66 | 67 | # License and copyright 68 | 69 | Copyright 2018-2021 Davide Alberani 70 | 71 | Licensed under the Apache License, Version 2.0 (the "License"); 72 | you may not use this file except in compliance with the License. 73 | You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 74 | 75 | Unless required by applicable law or agreed to in writing, software 76 | distributed under the License is distributed on an "AS IS" BASIS, 77 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 78 | See the License for the specific language governing permissions and 79 | limitations under the License. 80 | 81 | -------------------------------------------------------------------------------- /conf/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberanid/diffido/1ddfb76c859ebd972138a28ea8d0c4856c139c3d/conf/.gitkeep -------------------------------------------------------------------------------- /conf/diffido.conf: -------------------------------------------------------------------------------- 1 | debug=False 2 | admin_email='diffido@localhost' 3 | smtp_host='localhost' 4 | #smtp_port=0 5 | #smtp_local_hostname=None 6 | #smtp_use_ssl=False 7 | #smtp_starttls=False 8 | #smtp_ssl_keyfile=None 9 | #smtp_ssl_certfile=None 10 | #smtp_ssl_context=None 11 | #smtp_username='' 12 | #smtp_password='' 13 | -------------------------------------------------------------------------------- /diffido.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """Diffido - because the F5 key is a terrible thing to waste. 4 | 5 | Copyright 2018 Davide Alberani 6 | 7 | Licensed under the Apache License, Version 2.0 (the "License"); 8 | you may not use this file except in compliance with the License. 9 | You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. 16 | """ 17 | 18 | import os 19 | import re 20 | import json 21 | import pytz 22 | import shutil 23 | import urllib 24 | import smtplib 25 | from email.mime.text import MIMEText 26 | from email.utils import formatdate 27 | import logging 28 | import datetime 29 | import requests 30 | import subprocess 31 | import multiprocessing 32 | from lxml import etree 33 | from xml.etree import ElementTree 34 | 35 | from tornado.ioloop import IOLoop 36 | from apscheduler.triggers.cron import CronTrigger 37 | from apscheduler.schedulers.tornado import TornadoScheduler 38 | from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore 39 | 40 | import tornado.httpserver 41 | import tornado.ioloop 42 | import tornado.options 43 | from tornado.options import define, options 44 | import tornado.web 45 | from tornado import gen, escape 46 | 47 | 48 | JOBS_STORE = 'sqlite:///conf/jobs.db' 49 | API_VERSION = '1.0' 50 | SCHEDULES_FILE = 'conf/schedules.json' 51 | DEFAULT_CONF = 'conf/diffido.conf' 52 | EMAIL_FROM = 'diffido@localhost' 53 | SMTP_SETTINGS = {} 54 | GIT_CMD = 'git' 55 | 56 | re_commit = re.compile(r'^(?P[0-9a-f]{40}) (?P.*)\n(?: .* ' 57 | '(?P\d+) insertion.* (?P\d+) deletion.*$)?', re.M) 58 | re_insertion = re.compile(r'(\d+) insertion') 59 | re_deletion = re.compile(r'(\d+) deletion') 60 | 61 | logger = logging.getLogger() 62 | logger.setLevel(logging.INFO) 63 | 64 | 65 | def read_schedules(): 66 | """Return the schedules configuration. 67 | 68 | :returns: dictionary from the JSON object in conf/schedules.json 69 | :rtype: dict""" 70 | if not os.path.isfile(SCHEDULES_FILE): 71 | return {'schedules': {}} 72 | try: 73 | with open(SCHEDULES_FILE, 'r') as fd: 74 | schedules = json.loads(fd.read()) 75 | for id_ in schedules.get('schedules', {}).keys(): 76 | schedule = schedules['schedules'][id_] 77 | try: 78 | schedule['last_history'] = get_last_history(id_) 79 | except: 80 | schedule['last_history'] = {} 81 | continue 82 | return schedules 83 | except Exception as e: 84 | logger.error('unable to read %s: %s' % (SCHEDULES_FILE, e)) 85 | return {'schedules': {}} 86 | 87 | 88 | def write_schedules(schedules): 89 | """Write the schedules configuration. 90 | 91 | :param schedules: the schedules to save 92 | :type schedules: dict 93 | :returns: True in case of success 94 | :rtype: bool""" 95 | try: 96 | with open(SCHEDULES_FILE, 'w') as fd: 97 | fd.write(json.dumps(schedules, indent=2)) 98 | except Exception as e: 99 | logger.error('unable to write %s: %s' % (SCHEDULES_FILE, e)) 100 | return False 101 | return True 102 | 103 | 104 | def next_id(schedules): 105 | """Return the next available integer (as a string) in the list of schedules keys (do not fills holes) 106 | 107 | :param schedules: the schedules 108 | :type schedules: dict 109 | :returns: the ID of the next schedule 110 | :rtype: str""" 111 | ids = schedules.get('schedules', {}).keys() 112 | if not ids: 113 | return '1' 114 | return str(max([int(i) for i in ids]) + 1) 115 | 116 | 117 | def get_schedule(id_, add_id=True, add_history=False): 118 | """Return information about a single schedule 119 | 120 | :param id_: ID of the schedule 121 | :type id_: str 122 | :param add_id: if True, add the ID in the dictionary 123 | :type add_id: bool 124 | :returns: the schedule 125 | :rtype: dict""" 126 | try: 127 | schedules = read_schedules() 128 | except Exception: 129 | return {} 130 | data = schedules.get('schedules', {}).get(id_, {}) 131 | if add_history and data: 132 | data['last_history'] = get_last_history(id_) 133 | if add_id: 134 | data['id'] = str(id_) 135 | return data 136 | 137 | 138 | def select_xpath(content, xpath): 139 | """Select a portion of a HTML document 140 | 141 | :param content: the content of the document 142 | :type content: str 143 | :param xpath: the XPath selector 144 | :type xpath: str 145 | :returns: the selected document 146 | :rtype: str""" 147 | tree = etree.HTML(content) 148 | elems = tree.xpath(xpath) 149 | if not elems: 150 | return content 151 | selected_content = [] 152 | for elem in elems: 153 | pieces = [] 154 | if elem.text: 155 | pieces.append(elem.text) 156 | for sub_el in elem.getchildren(): 157 | try: 158 | sub_el_text = ElementTree.tostring(sub_el, method='html').decode('utf-8', 'replace') 159 | except: 160 | continue 161 | if sub_el_text: 162 | pieces.append(sub_el_text) 163 | selected_content.append(''.join(pieces)) 164 | content = ''.join(selected_content).strip() 165 | return content 166 | 167 | 168 | def run_job(id_=None, force=False, *args, **kwargs): 169 | """Run a job 170 | 171 | :param id_: ID of the schedule to run 172 | :type id_: str 173 | :param force: run even if disabled 174 | :type force: bool 175 | :param args: positional arguments 176 | :type args: tuple 177 | :param kwargs: named arguments 178 | :type kwargs: dict 179 | :returns: True in case of success 180 | :rtype: bool""" 181 | schedule = get_schedule(id_, add_id=False) 182 | url = schedule.get('url') 183 | if not url: 184 | return False 185 | logger.debug('running job id:%s title:%s url: %s' % (id_, schedule.get('title', ''), url)) 186 | if not schedule.get('enabled') and not force: 187 | logger.info('not running job %s: disabled' % id_) 188 | return True 189 | req = requests.get(url, allow_redirects=True, timeout=(30.10, 240)) 190 | content = req.text 191 | xpath = schedule.get('xpath') 192 | if xpath: 193 | try: 194 | content = select_xpath(content, xpath) 195 | except Exception as e: 196 | logger.warn('unable to extract XPath %s: %s' % (xpath, e)) 197 | req_path = urllib.parse.urlparse(req.url).path 198 | base_name = os.path.basename(req_path) or 'index.html' 199 | def _commit(id_, filename, content, queue): 200 | try: 201 | os.chdir('storage/%s' % id_) 202 | except Exception as e: 203 | logger.info('unable to move to storage/%s directory: %s; trying to create it...' % (id_, e)) 204 | _created = False 205 | try: 206 | _created = git_create_repo(id_) 207 | except Exception as e: 208 | logger.info('unable to move to storage/%s directory: %s; unable to create it' % (id_, e)) 209 | if not _created: 210 | return False 211 | current_lines = 0 212 | if os.path.isfile(filename): 213 | with open(filename, 'r') as fd: 214 | for line in fd: 215 | current_lines += 1 216 | with open(filename, 'w') as fd: 217 | fd.write(content) 218 | p = subprocess.Popen([GIT_CMD, 'add', filename]) 219 | p.communicate() 220 | p = subprocess.Popen([GIT_CMD, 'commit', '-m', '%s' % datetime.datetime.utcnow(), '--allow-empty'], 221 | stdout=subprocess.PIPE) 222 | stdout, _ = p.communicate() 223 | stdout = stdout.decode('utf-8') 224 | insert = re_insertion.findall(stdout) 225 | if insert: 226 | insert = int(insert[0]) 227 | else: 228 | insert = 0 229 | delete = re_deletion.findall(stdout) 230 | if delete: 231 | delete = int(delete[0]) 232 | else: 233 | delete = 0 234 | queue.put({'insertions': insert, 'deletions': delete, 'previous_lines': current_lines, 235 | 'changes': max(insert, delete)}) 236 | queue = multiprocessing.Queue() 237 | p = multiprocessing.Process(target=_commit, args=(id_, base_name, content, queue)) 238 | p.start() 239 | res = queue.get() 240 | p.join() 241 | email = schedule.get('email') 242 | if not email: 243 | return True 244 | changes = res.get('changes') 245 | if not changes: 246 | return True 247 | min_change = schedule.get('minimum_change') 248 | previous_lines = res.get('previous_lines') 249 | if min_change and previous_lines: 250 | min_change = float(min_change) 251 | change_fraction = res.get('changes') / previous_lines 252 | if change_fraction < min_change: 253 | return True 254 | # send notification 255 | diff = get_diff(id_).get('diff') 256 | if not diff: 257 | return True 258 | send_email(to=email, subject='%s page changed' % schedule.get('title'), 259 | body='changes:\n\n%s' % diff) 260 | return True 261 | 262 | 263 | def safe_run_job(id_=None, *args, **kwargs): 264 | """Safely run a job, catching all the exceptions 265 | 266 | :param id_: ID of the schedule to run 267 | :type id_: str 268 | :param args: positional arguments 269 | :type args: tuple 270 | :param kwargs: named arguments 271 | :type kwargs: dict 272 | :returns: True in case of success 273 | :rtype: bool""" 274 | try: 275 | run_job(id_, *args, **kwargs) 276 | except Exception as e: 277 | send_email('error executing job %s: %s' % (id_, e)) 278 | 279 | 280 | def send_email(to, subject='diffido', body='', from_=None): 281 | """Send an email 282 | 283 | :param to: destination address 284 | :type to: str 285 | :param subject: email subject 286 | :type subject: str 287 | :param body: body of the email 288 | :type body: str 289 | :param from_: sender address 290 | :type from_: str 291 | :returns: True in case of success 292 | :rtype: bool""" 293 | msg = MIMEText(body) 294 | msg['Subject'] = subject 295 | msg['From'] = from_ or EMAIL_FROM 296 | msg['To'] = to 297 | msg["Date"] = formatdate(localtime=True) 298 | starttls = SMTP_SETTINGS.get('smtp-starttls') 299 | use_ssl = SMTP_SETTINGS.get('smtp-use-ssl') 300 | username = SMTP_SETTINGS.get('smtp-username') 301 | password = SMTP_SETTINGS.get('smtp-password') 302 | args = {} 303 | for key, value in SMTP_SETTINGS.items(): 304 | if key in ('smtp-starttls', 'smtp-use-ssl', 'smtp-username', 'smtp-password'): 305 | continue 306 | if key in ('smtp-port'): 307 | value = int(value) 308 | key = key.replace('smtp-', '', 1).replace('-', '_') 309 | args[key] = value 310 | try: 311 | if use_ssl: 312 | for key in ('ssl_keyfile', 'ssl_certfile', 'ssl_context'): 313 | if key in args: 314 | args[key.replace('ssl_', '')] = args[key] 315 | del args[key] 316 | logger.debug('STMP SSL connection with args: %s' % repr(args)) 317 | with smtplib.SMTP_SSL(**args) as s: 318 | if username: 319 | logger.debug('STMP LOGIN for username %s and password of length %d' % (username, len(password))) 320 | s.login(username, password) 321 | s.send_message(msg) 322 | else: 323 | tls_args = {} 324 | for key in ('ssl_keyfile', 'ssl_certfile', 'ssl_context'): 325 | if key in args: 326 | tls_args[key.replace('ssl_', '')] = args[key] 327 | del args[key] 328 | logger.debug('STMP connection with args: %s' % repr(args)) 329 | with smtplib.SMTP(**args) as s: 330 | if starttls: 331 | logger.debug('STMP STARTTLS connection with args: %s' % repr(tls_args)) 332 | s.ehlo_or_helo_if_needed() 333 | s.starttls(**tls_args) 334 | if username: 335 | logger.debug('STMP LOGIN for username %s and password of length %d' % (username, len(password))) 336 | s.login(username, password) 337 | s.send_message(msg) 338 | except Exception as e: 339 | logger.error('unable to send email to %s: %s' % (to, e)) 340 | return False 341 | return True 342 | 343 | 344 | def get_history(id_, limit=None, add_info=False): 345 | """Read the history of a schedule 346 | 347 | :param id_: ID of the schedule 348 | :type id_: str 349 | :param limit: number of entries to fetch 350 | :type limit: int 351 | :param add_info: add information about the schedule itself 352 | :type add_info: int 353 | :returns: information about the schedule and its history 354 | :rtype: dict""" 355 | def _history(id_, limit, queue): 356 | try: 357 | os.chdir('storage/%s' % id_) 358 | except Exception as e: 359 | logger.info('unable to move to storage/%s directory: %s' % (id_, e)) 360 | return queue.put(b'') 361 | cmd = [GIT_CMD, 'log', '--pretty=oneline', '--shortstat'] 362 | if limit is not None: 363 | cmd.append('-%s' % limit) 364 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE) 365 | stdout, _ = p.communicate() 366 | queue.put(stdout) 367 | queue = multiprocessing.Queue() 368 | p = multiprocessing.Process(target=_history, args=(id_, limit, queue)) 369 | p.start() 370 | res = queue.get().decode('utf-8') 371 | p.join() 372 | history = [] 373 | for match in re_commit.finditer(res): 374 | info = match.groupdict() 375 | info['insertions'] = int(info['insertions'] or 0) 376 | info['deletions'] = int(info['deletions'] or 0) 377 | info['changes'] = max(info['insertions'], info['deletions']) 378 | history.append(info) 379 | last_id = None 380 | if history and 'id' in history[0]: 381 | last_id = history[0]['id'] 382 | for idx, item in enumerate(history): 383 | item['seq'] = idx + 1 384 | data = {'history': history, 'last_id': last_id} 385 | if add_info: 386 | data['schedule'] = get_schedule(id_) 387 | return data 388 | 389 | 390 | def get_last_history(id_): 391 | """Read the last history entry of a schedule 392 | 393 | :param id_: ID of the schedule 394 | :type id_: str 395 | :returns: information about the schedule and its history 396 | :rtype: dict""" 397 | history = get_history(id_, limit=1) 398 | hist = history.get('history') or [{}] 399 | return hist[0] 400 | 401 | 402 | def get_diff(id_, commit_id='HEAD', old_commit_id=None): 403 | """Return the diff between commits of a schedule 404 | 405 | :param id_: ID of the schedule 406 | :type id_: str 407 | :param commit_id: the most recent commit ID; HEAD by default 408 | :type commit_id: str 409 | :param old_commit_id: the older commit ID; if None, the previous commit is used 410 | :type old_commit_id: str 411 | :returns: information about the schedule and the diff between commits 412 | :rtype: dict""" 413 | def _history(id_, commit_id, old_commit_id, queue): 414 | try: 415 | os.chdir('storage/%s' % id_) 416 | except Exception as e: 417 | logger.info('unable to move to storage/%s directory: %s' % (id_, e)) 418 | return queue.put(b'') 419 | p = subprocess.Popen([GIT_CMD, 'diff', old_commit_id or '%s~' % commit_id, commit_id], 420 | stdout=subprocess.PIPE) 421 | stdout, _ = p.communicate() 422 | queue.put(stdout) 423 | queue = multiprocessing.Queue() 424 | p = multiprocessing.Process(target=_history, args=(id_, commit_id, old_commit_id, queue)) 425 | p.start() 426 | res = queue.get().decode('utf-8') 427 | p.join() 428 | schedule = get_schedule(id_) 429 | return {'diff': res, 'schedule': schedule} 430 | 431 | 432 | def scheduler_update(scheduler, id_): 433 | """Update a scheduler job, using information from the JSON object 434 | 435 | :param scheduler: the TornadoScheduler instance to modify 436 | :type scheduler: TornadoScheduler 437 | :param id_: ID of the schedule that must be updated 438 | :type id_: str 439 | :returns: True in case of success 440 | :rtype: bool""" 441 | schedule = get_schedule(id_, add_id=False) 442 | if not schedule: 443 | logger.warn('unable to update empty schedule %s' % id_) 444 | return False 445 | trigger = schedule.get('trigger') 446 | if trigger not in ('interval', 'cron'): 447 | logger.warn('unable to update empty schedule %s: trigger not in ("cron", "interval")' % id_) 448 | return False 449 | args = {} 450 | if trigger == 'interval': 451 | args['trigger'] = 'interval' 452 | for unit in 'weeks', 'days', 'hours', 'minutes', 'seconds': 453 | if 'interval_%s' % unit not in schedule: 454 | continue 455 | try: 456 | val = schedule['interval_%s' % unit] 457 | if not val: 458 | continue 459 | args[unit] = int(val) 460 | except Exception: 461 | logger.warn('invalid argument on schedule %s: %s parameter %s is not an integer' % 462 | (id_, 'interval_%s' % unit, schedule['interval_%s' % unit])) 463 | if len(args) == 1: 464 | logger.error('no valid interval specified, skipping schedule %s' % id_) 465 | return False 466 | elif trigger == 'cron': 467 | try: 468 | cron_trigger = CronTrigger.from_crontab(schedule['cron_crontab']) 469 | args['trigger'] = cron_trigger 470 | except Exception: 471 | logger.warn('invalid argument on schedule %s: cron_tab parameter %s is not a valid crontab' % 472 | (id_, schedule.get('cron_crontab'))) 473 | return False 474 | git_create_repo(id_) 475 | try: 476 | scheduler.add_job(safe_run_job, id=id_, replace_existing=True, kwargs={'id_': id_}, **args) 477 | except Exception as e: 478 | logger.warn('unable to update job %s: %s' % (id_, e)) 479 | return False 480 | return True 481 | 482 | 483 | def scheduler_delete(scheduler, id_): 484 | """Update a scheduler job, using information from the JSON object 485 | 486 | :param scheduler: the TornadoScheduler instance to modify 487 | :type scheduler: TornadoScheduler 488 | :param id_: ID of the schedule 489 | :type id_: str 490 | :returns: True in case of success 491 | :rtype: bool""" 492 | try: 493 | scheduler.remove_job(job_id=id_) 494 | except Exception as e: 495 | logger.warn('unable to delete job %s: %s' % (id_, e)) 496 | return False 497 | return git_delete_repo(id_) 498 | 499 | 500 | def reset_from_schedules(scheduler): 501 | """"Reset all scheduler jobs, using information from the JSON object 502 | 503 | :param scheduler: the TornadoScheduler instance to modify 504 | :type scheduler: TornadoScheduler 505 | :returns: True in case of success 506 | :rtype: bool""" 507 | ret = False 508 | try: 509 | scheduler.remove_all_jobs() 510 | for key in read_schedules().get('schedules', {}).keys(): 511 | ret |= scheduler_update(scheduler, id_=key) 512 | except Exception as e: 513 | logger.warn('unable to reset all jobs: %s' % e) 514 | return False 515 | return ret 516 | 517 | 518 | def git_init(): 519 | """Initialize Git global settings""" 520 | p = subprocess.Popen([GIT_CMD, 'config', '--global', 'user.email', '"%s"' % EMAIL_FROM]) 521 | p.communicate() 522 | p = subprocess.Popen([GIT_CMD, 'config', '--global', 'user.name', '"Diffido"']) 523 | p.communicate() 524 | 525 | 526 | def git_create_repo(id_): 527 | """Create a Git repository 528 | 529 | :param id_: ID of the schedule 530 | :type id_: str 531 | :returns: True in case of success 532 | :rtype: bool""" 533 | repo_dir = 'storage/%s' % id_ 534 | if os.path.isdir(repo_dir): 535 | return True 536 | p = subprocess.Popen([GIT_CMD, 'init', repo_dir]) 537 | p.communicate() 538 | return p.returncode == 0 539 | 540 | 541 | def git_delete_repo(id_): 542 | """Delete a Git repository 543 | 544 | :param id_: ID of the schedule 545 | :type id_: str 546 | :returns: True in case of success 547 | :rtype: bool""" 548 | repo_dir = 'storage/%s' % id_ 549 | if not os.path.isdir(repo_dir): 550 | return False 551 | try: 552 | shutil.rmtree(repo_dir) 553 | except Exception as e: 554 | logger.warn('unable to delete Git repository %s: %s' % (id_, e)) 555 | return False 556 | return True 557 | 558 | 559 | class DiffidoBaseException(Exception): 560 | """Base class for diffido custom exceptions. 561 | 562 | :param message: text message 563 | :type message: str 564 | :param status: numeric http status code 565 | :type status: int""" 566 | def __init__(self, message, status=400): 567 | super(DiffidoBaseException, self).__init__(message) 568 | self.message = message 569 | self.status = status 570 | 571 | 572 | class BaseHandler(tornado.web.RequestHandler): 573 | """Base class for request handlers.""" 574 | # A property to access the first value of each argument. 575 | arguments = property(lambda self: dict([(k, v[0].decode('utf-8')) 576 | for k, v in self.request.arguments.items()])) 577 | 578 | @property 579 | def clean_body(self): 580 | """Return a clean dictionary from a JSON body, suitable for a query on MongoDB. 581 | 582 | :returns: a clean copy of the body arguments 583 | :rtype: dict""" 584 | return escape.json_decode(self.request.body or '{}') 585 | 586 | def write_error(self, status_code, **kwargs): 587 | """Default error handler.""" 588 | if isinstance(kwargs.get('exc_info', (None, None))[1], DiffidoBaseException): 589 | exc = kwargs['exc_info'][1] 590 | status_code = exc.status 591 | message = exc.message 592 | else: 593 | message = 'internal error' 594 | self.build_error(message, status=status_code) 595 | 596 | def initialize(self, **kwargs): 597 | """Add every passed (key, value) as attributes of the instance.""" 598 | for key, value in kwargs.items(): 599 | setattr(self, key, value) 600 | 601 | def build_error(self, message='', status=400): 602 | """Build and write an error message. 603 | 604 | :param message: textual message 605 | :type message: str 606 | :param status: HTTP status code 607 | :type status: int 608 | """ 609 | self.set_status(status) 610 | self.write({'error': True, 'message': message}) 611 | 612 | def build_success(self, message='', status=200): 613 | """Build and write a success message. 614 | 615 | :param message: textual message 616 | :type message: str 617 | :param status: HTTP status code 618 | :type status: int 619 | """ 620 | self.set_status(status) 621 | self.write({'error': False, 'message': message}) 622 | 623 | 624 | class SchedulesHandler(BaseHandler): 625 | """Schedules handler.""" 626 | @gen.coroutine 627 | def get(self, id_=None, *args, **kwargs): 628 | """Get a schedule.""" 629 | if id_ is not None: 630 | return self.write({'schedule': get_schedule(id_, add_history=True)}) 631 | schedules = read_schedules() 632 | self.write(schedules) 633 | 634 | @gen.coroutine 635 | def put(self, id_=None, *args, **kwargs): 636 | """Update a schedule.""" 637 | if id_ is None: 638 | return self.build_error(message='update action requires an ID') 639 | data = self.clean_body 640 | schedules = read_schedules() 641 | if id_ not in schedules.get('schedules', {}): 642 | return self.build_error(message='schedule %s not found' % id_) 643 | schedules['schedules'][id_] = data 644 | write_schedules(schedules) 645 | scheduler_update(scheduler=self.scheduler, id_=id_) 646 | self.write(get_schedule(id_=id_)) 647 | 648 | @gen.coroutine 649 | def post(self, *args, **kwargs): 650 | """Add a schedule.""" 651 | data = self.clean_body 652 | schedules = read_schedules() 653 | id_ = next_id(schedules) 654 | schedules['schedules'][id_] = data 655 | write_schedules(schedules) 656 | scheduler_update(scheduler=self.scheduler, id_=id_) 657 | self.write(get_schedule(id_=id_)) 658 | 659 | @gen.coroutine 660 | def delete(self, id_=None, *args, **kwargs): 661 | """Delete a schedule.""" 662 | if id_ is None: 663 | return self.build_error(message='an ID must be specified') 664 | schedules = read_schedules() 665 | if id_ in schedules.get('schedules', {}): 666 | del schedules['schedules'][id_] 667 | write_schedules(schedules) 668 | scheduler_delete(scheduler=self.scheduler, id_=id_) 669 | self.build_success(message='removed schedule %s' % id_) 670 | 671 | 672 | class RunScheduleHandler(BaseHandler): 673 | """Reset schedules handler.""" 674 | @gen.coroutine 675 | def post(self, id_, *args, **kwargs): 676 | if run_job(id_, force=True): 677 | return self.build_success('job run') 678 | self.build_error('job not run') 679 | 680 | 681 | class ResetSchedulesHandler(BaseHandler): 682 | """Reset schedules handler.""" 683 | @gen.coroutine 684 | def post(self, *args, **kwargs): 685 | reset_from_schedules(self.scheduler) 686 | 687 | 688 | class HistoryHandler(BaseHandler): 689 | """History handler.""" 690 | @gen.coroutine 691 | def get(self, id_, *args, **kwargs): 692 | self.write(get_history(id_, add_info=True)) 693 | 694 | 695 | class DiffHandler(BaseHandler): 696 | """Diff handler.""" 697 | @gen.coroutine 698 | def get(self, id_, commit_id, old_commit_id=None, *args, **kwargs): 699 | self.write(get_diff(id_, commit_id, old_commit_id)) 700 | 701 | 702 | class TemplateHandler(BaseHandler): 703 | """Handler for the template files in the / path.""" 704 | @gen.coroutine 705 | def get(self, *args, **kwargs): 706 | """Get a template file.""" 707 | page = 'index.html' 708 | if args and args[0]: 709 | page = args[0].strip('/') 710 | arguments = self.arguments 711 | self.render(page, **arguments) 712 | 713 | 714 | def serve(): 715 | """Read configuration and start the server.""" 716 | global EMAIL_FROM, SMTP_SETTINGS 717 | jobstores = {'default': SQLAlchemyJobStore(url=JOBS_STORE)} 718 | scheduler = TornadoScheduler(jobstores=jobstores, timezone=pytz.utc) 719 | scheduler.start() 720 | 721 | define('port', default=3210, help='run on the given port', type=int) 722 | define('address', default='', help='bind the server at the given address', type=str) 723 | define('ssl_cert', default=os.path.join(os.path.dirname(__file__), 'ssl', 'diffido_cert.pem'), 724 | help='specify the SSL certificate to use for secure connections') 725 | define('ssl_key', default=os.path.join(os.path.dirname(__file__), 'ssl', 'diffido_key.pem'), 726 | help='specify the SSL private key to use for secure connections') 727 | define('admin-email', default='', help='email address of the site administrator', type=str) 728 | define('smtp-host', default='localhost', help='SMTP server address', type=str) 729 | define('smtp-port', default=0, help='SMTP server port', type=int) 730 | define('smtp-local-hostname', default=None, help='SMTP local hostname', type=str) 731 | define('smtp-use-ssl', default=False, help='Use SSL to connect to the SMTP server', type=bool) 732 | define('smtp-starttls', default=False, help='Use STARTTLS to connect to the SMTP server', type=bool) 733 | define('smtp-ssl-keyfile', default=None, help='SMTP SSL key file', type=str) 734 | define('smtp-ssl-certfile', default=None, help='SMTP SSL cert file', type=str) 735 | define('smtp-ssl-context', default=None, help='SMTP SSL context', type=str) 736 | define('smtp-username', default='', help='SMTP username', type=str) 737 | define('smtp-password', default='', help='SMTP password', type=str) 738 | define('debug', default=False, help='run in debug mode', type=bool) 739 | define('config', help='read configuration file', 740 | callback=lambda path: tornado.options.parse_config_file(path, final=False)) 741 | if not options.config and os.path.isfile(DEFAULT_CONF): 742 | tornado.options.parse_config_file(DEFAULT_CONF, final=False) 743 | tornado.options.parse_command_line() 744 | if options.admin_email: 745 | EMAIL_FROM = options.admin_email 746 | 747 | for key, value in options.as_dict().items(): 748 | if key.startswith('smtp-'): 749 | SMTP_SETTINGS[key] = value 750 | 751 | if options.debug: 752 | logger.setLevel(logging.DEBUG) 753 | 754 | ssl_options = {} 755 | if os.path.isfile(options.ssl_key) and os.path.isfile(options.ssl_cert): 756 | ssl_options = dict(certfile=options.ssl_cert, keyfile=options.ssl_key) 757 | 758 | init_params = dict(listen_port=options.port, logger=logger, ssl_options=ssl_options, 759 | scheduler=scheduler) 760 | git_init() 761 | 762 | _reset_schedules_path = r'schedules/reset' 763 | _schedule_run_path = r'schedules/(?P\d+)/run' 764 | _schedules_path = r'schedules/?(?P\d+)?' 765 | _history_path = r'schedules/?(?P\d+)/history' 766 | _diff_path = r'schedules/(?P\d+)/diff/(?P[0-9a-f]+)/?(?P[0-9a-f]+)?/?' 767 | application = tornado.web.Application([ 768 | (r'/api/%s' % _reset_schedules_path, ResetSchedulesHandler, init_params), 769 | (r'/api/v%s/%s' % (API_VERSION, _reset_schedules_path), ResetSchedulesHandler, init_params), 770 | (r'/api/%s' % _schedule_run_path, RunScheduleHandler, init_params), 771 | (r'/api/v%s/%s' % (API_VERSION, _schedule_run_path), RunScheduleHandler, init_params), 772 | (r'/api/%s' % _history_path, HistoryHandler, init_params), 773 | (r'/api/v%s/%s' % (API_VERSION, _history_path), HistoryHandler, init_params), 774 | (r'/api/%s' % _diff_path, DiffHandler, init_params), 775 | (r'/api/v%s/%s' % (API_VERSION, _diff_path), DiffHandler, init_params), 776 | (r'/api/%s' % _schedules_path, SchedulesHandler, init_params), 777 | (r'/api/v%s/%s' % (API_VERSION, _schedules_path), SchedulesHandler, init_params), 778 | (r'/?(.*)', TemplateHandler, init_params), 779 | ], 780 | static_path=os.path.join(os.path.dirname(__file__), 'dist/static'), 781 | template_path=os.path.join(os.path.dirname(__file__), 'dist/'), 782 | debug=options.debug) 783 | http_server = tornado.httpserver.HTTPServer(application, ssl_options=ssl_options or None) 784 | logger.info('Start serving on %s://%s:%d', 'https' if ssl_options else 'http', 785 | options.address if options.address else '127.0.0.1', 786 | options.port) 787 | http_server.listen(options.port, options.address) 788 | try: 789 | IOLoop.instance().start() 790 | except (KeyboardInterrupt, SystemExit): 791 | pass 792 | 793 | 794 | if __name__ == '__main__': 795 | serve() 796 | -------------------------------------------------------------------------------- /dist/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% block title %}diffido{% end %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {% block head %}{% end %} 14 | 60 | 61 | 62 | {% block body %}{% end %} 63 | 64 | diffido © Davide Alberani 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /dist/diff.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block head %} 4 | 5 | 6 | {% end %} 7 | 8 | {% block body %} 9 |
10 |
11 |
12 | 13 | 14 |
15 | 16 | home 17 | 18 | Diffido: ${schedule && schedule.title} diff 19 |
20 |
21 | 22 | 23 |
24 |
25 |
26 |
27 |
28 |
29 | 30 | 76 | {% end %} 77 | -------------------------------------------------------------------------------- /dist/history.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 | 8 | 9 |
10 | 11 | home 12 | 13 | Diffido - ${schedule && schedule.title} history 14 |
15 |
16 | 17 | 18 | 19 | 20 | show entries with no changes 21 |
22 | 23 | Compare selected revisions 24 | 25 |
26 | 27 | 28 |
29 |
30 | (curcur | prev)  31 |
32 |
33 | 34 |
35 |
36 | 37 |
38 |
39 |
40 | 41 | Commit: ${ prettifyCommitID(item) } 42 | ${ item.id } 43 |
44 | Changes: +${ item.insertions || 0 },-${ item.deletions || 0 } 45 |
46 | ${ prettifyDate(item.message) } 47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | 55 | 120 | {% end %} 121 | 122 | {% block style %} 123 | 124 | .placeholder { 125 | width: 36px; 126 | display: inline-block; 127 | } 128 | 129 | {% end %} 130 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 | 8 | 9 |
10 | 11 | home 12 | 13 | Diffido 14 | 15 | add_circle_outline 16 | 17 |
18 |
19 | 20 | 21 | 22 | 23 | 24 | ${ item.id } 25 | 26 | 27 | check_box 28 | check_box_outline_blank 29 | 30 | 31 | ${ item.title } 32 |
33 | 34 | link 35 | ${ prettifyLink(item) } 36 | ${ item.url } 37 | 38 |
39 | 40 | ${ triggerString(item) } 41 |
42 | last check: ${ prettifyLastCheck(item) } 43 |
44 | 45 |
46 |
47 | 48 | history 49 | show history 50 | 51 |
52 |
53 | 54 | play_circle_outline 55 | run now 56 | 57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | 68 | 139 | {% end %} 140 | {% block style %} 141 | 142 | .table-cell-left > .md-table-cell-container { 143 | padding-left: 12px; 144 | } 145 | 146 | {% end %} 147 | -------------------------------------------------------------------------------- /dist/schedule.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 |
8 | 9 | 10 | home 11 | 12 | Diffido: ${(schedule && schedule.title) || 'new'} schedule 13 | 14 |
15 |
16 | 17 |
18 | 19 | 20 |
21 | Settings 22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 | 30 | 31 | 32 |
33 |
34 | 35 | 36 | 37 | 38 |
39 |
40 | 41 |
42 |
43 | 44 | 45 | 46 | 47 |
48 |
49 | 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | 59 |
60 |
61 | enabled 62 |
63 |
64 |
65 | 66 |
67 | 68 | 69 |
70 | Trigger 71 |
72 |
73 | 74 |
75 |
76 | 77 | 78 | 79 | interval 80 | cron 81 | 82 | 83 |
84 |
85 |
86 |
87 | 88 | 89 | 90 | 91 |
92 |
93 | 94 |
95 |
96 | 97 | 98 | 99 | 100 |
101 |
102 | 103 | 104 | 105 | 106 |
107 |
108 |
109 |
110 | 111 | 112 | 113 | 114 |
115 |
116 | 117 | 118 | 119 | 120 |
121 |
122 | 123 | 124 | 125 | 126 |
127 |
128 |
129 |
130 |
131 | 132 |
133 |
134 |
135 | save 136 | delete 137 | back 138 |
139 |
140 |
141 |
142 | 143 | 203 | {% end %} 204 | 205 | {% block style %} 206 | 207 | body { 208 | padding: 12px 20px 12px 20px !important; 209 | } 210 | 211 | .home-icon { 212 | margin-top: -6px; 213 | } 214 | 215 | .md-card-content { 216 | padding: 20px; 217 | } 218 | 219 | #trigger-card, #main-card { 220 | min-height: 350px; 221 | } 222 | 223 | {% end %} 224 | -------------------------------------------------------------------------------- /dist/static/css/diff2html.css: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Diff to HTML (diff2html.css) 4 | * Author: rtfpessoa 5 | * 6 | */ 7 | 8 | .d2h-wrapper { 9 | text-align: left; 10 | } 11 | 12 | .d2h-file-header { 13 | padding: 5px 10px; 14 | border-bottom: 1px solid #d8d8d8; 15 | background-color: #f7f7f7; 16 | } 17 | 18 | .d2h-file-stats { 19 | display: -webkit-box; 20 | display: -ms-flexbox; 21 | display: flex; 22 | margin-left: auto; 23 | font-size: 14px; 24 | } 25 | 26 | .d2h-lines-added { 27 | text-align: right; 28 | border: 1px solid #b4e2b4; 29 | border-radius: 5px 0 0 5px; 30 | color: #399839; 31 | padding: 2px; 32 | vertical-align: middle; 33 | } 34 | 35 | .d2h-lines-deleted { 36 | text-align: left; 37 | border: 1px solid #e9aeae; 38 | border-radius: 0 5px 5px 0; 39 | color: #c33; 40 | padding: 2px; 41 | vertical-align: middle; 42 | margin-left: 1px; 43 | } 44 | 45 | .d2h-file-name-wrapper { 46 | display: -webkit-box; 47 | display: -ms-flexbox; 48 | display: flex; 49 | -webkit-box-align: center; 50 | -ms-flex-align: center; 51 | align-items: center; 52 | width: 100%; 53 | font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; 54 | font-size: 15px; 55 | } 56 | 57 | .d2h-file-name { 58 | white-space: nowrap; 59 | text-overflow: ellipsis; 60 | overflow-x: hidden; 61 | line-height: 21px; 62 | } 63 | 64 | .d2h-file-wrapper { 65 | border: 1px solid #ddd; 66 | border-radius: 3px; 67 | margin-bottom: 1em; 68 | } 69 | 70 | .d2h-diff-table { 71 | width: 100%; 72 | border-collapse: collapse; 73 | font-family: "Menlo", "Consolas", monospace; 74 | font-size: 13px; 75 | } 76 | 77 | .d2h-diff-tbody > tr > td { 78 | height: 20px; 79 | line-height: 20px; 80 | } 81 | 82 | .d2h-files-diff { 83 | display: block; 84 | width: 100%; 85 | height: 100%; 86 | } 87 | 88 | .d2h-file-diff { 89 | overflow-x: scroll; 90 | overflow-y: hidden; 91 | } 92 | 93 | .d2h-file-side-diff { 94 | display: inline-block; 95 | overflow-x: scroll; 96 | overflow-y: hidden; 97 | width: 50%; 98 | margin-right: -4px; 99 | margin-bottom: -8px; 100 | } 101 | 102 | .d2h-code-line { 103 | display: inline-block; 104 | white-space: nowrap; 105 | padding: 0 10px; 106 | margin-left: 80px; 107 | } 108 | 109 | .d2h-code-side-line { 110 | display: inline-block; 111 | white-space: nowrap; 112 | padding: 0 10px; 113 | margin-left: 50px; 114 | } 115 | 116 | .d2h-code-line del, 117 | .d2h-code-side-line del { 118 | display: inline-block; 119 | margin-top: -1px; 120 | text-decoration: none; 121 | background-color: #ffb6ba; 122 | border-radius: 0.2em; 123 | } 124 | 125 | .d2h-code-line ins, 126 | .d2h-code-side-line ins { 127 | display: inline-block; 128 | margin-top: -1px; 129 | text-decoration: none; 130 | background-color: #97f295; 131 | border-radius: 0.2em; 132 | text-align: left; 133 | } 134 | 135 | .d2h-code-line-prefix { 136 | display: inline; 137 | background: none; 138 | padding: 0; 139 | word-wrap: normal; 140 | white-space: pre; 141 | } 142 | 143 | .d2h-code-line-ctn { 144 | display: inline; 145 | background: none; 146 | padding: 0; 147 | word-wrap: normal; 148 | white-space: pre; 149 | } 150 | 151 | .line-num1 { 152 | -webkit-box-sizing: border-box; 153 | box-sizing: border-box; 154 | float: left; 155 | width: 40px; 156 | overflow: hidden; 157 | text-overflow: ellipsis; 158 | padding-left: 3px; 159 | } 160 | 161 | .line-num2 { 162 | -webkit-box-sizing: border-box; 163 | box-sizing: border-box; 164 | float: right; 165 | width: 40px; 166 | overflow: hidden; 167 | text-overflow: ellipsis; 168 | padding-left: 3px; 169 | } 170 | 171 | .d2h-code-linenumber { 172 | -webkit-box-sizing: border-box; 173 | box-sizing: border-box; 174 | position: absolute; 175 | width: 86px; 176 | padding-left: 2px; 177 | padding-right: 2px; 178 | background-color: #fff; 179 | color: rgba(0, 0, 0, 0.3); 180 | text-align: right; 181 | border: solid #eeeeee; 182 | border-width: 0 1px 0 1px; 183 | cursor: pointer; 184 | } 185 | 186 | .d2h-code-side-linenumber { 187 | -webkit-box-sizing: border-box; 188 | box-sizing: border-box; 189 | position: absolute; 190 | width: 56px; 191 | padding-left: 5px; 192 | padding-right: 5px; 193 | background-color: #fff; 194 | color: rgba(0, 0, 0, 0.3); 195 | text-align: right; 196 | border: solid #eeeeee; 197 | border-width: 0 1px 0 1px; 198 | cursor: pointer; 199 | overflow: hidden; 200 | text-overflow: ellipsis; 201 | } 202 | 203 | /* 204 | * Changes Highlight 205 | */ 206 | 207 | .d2h-del { 208 | background-color: #fee8e9; 209 | border-color: #e9aeae; 210 | } 211 | 212 | .d2h-ins { 213 | background-color: #dfd; 214 | border-color: #b4e2b4; 215 | } 216 | 217 | .d2h-info { 218 | background-color: #f8fafd; 219 | color: rgba(0, 0, 0, 0.3); 220 | border-color: #d5e4f2; 221 | } 222 | 223 | .d2h-file-diff .d2h-del.d2h-change { 224 | background-color: #fdf2d0; 225 | } 226 | 227 | .d2h-file-diff .d2h-ins.d2h-change { 228 | background-color: #ded; 229 | } 230 | 231 | /* 232 | * File Summary List 233 | */ 234 | 235 | .d2h-file-list-wrapper { 236 | margin-bottom: 10px; 237 | } 238 | 239 | .d2h-file-list-wrapper a { 240 | text-decoration: none; 241 | color: #3572b0; 242 | } 243 | 244 | .d2h-file-list-wrapper a:visited { 245 | color: #3572b0; 246 | } 247 | 248 | .d2h-file-list-header { 249 | text-align: left; 250 | } 251 | 252 | .d2h-file-list-title { 253 | font-weight: bold; 254 | } 255 | 256 | .d2h-file-list-line { 257 | display: -webkit-box; 258 | display: -ms-flexbox; 259 | display: flex; 260 | text-align: left; 261 | } 262 | 263 | .d2h-file-list { 264 | display: block; 265 | list-style: none; 266 | padding: 0; 267 | margin: 0; 268 | } 269 | 270 | .d2h-file-list > li { 271 | border-bottom: #ddd solid 1px; 272 | padding: 5px 10px; 273 | margin: 0; 274 | } 275 | 276 | .d2h-file-list > li:last-child { 277 | border-bottom: none; 278 | } 279 | 280 | .d2h-file-switch { 281 | display: none; 282 | font-size: 10px; 283 | cursor: pointer; 284 | } 285 | 286 | .d2h-icon-wrapper { 287 | line-height: 31px; 288 | } 289 | 290 | .d2h-icon { 291 | vertical-align: middle; 292 | margin-right: 10px; 293 | fill: currentColor; 294 | } 295 | 296 | .d2h-deleted { 297 | color: #c33; 298 | } 299 | 300 | .d2h-added { 301 | color: #399839; 302 | } 303 | 304 | .d2h-changed { 305 | color: #d0b44c; 306 | } 307 | 308 | .d2h-moved { 309 | color: #3572b0; 310 | } 311 | 312 | .d2h-tag { 313 | display: -webkit-box; 314 | display: -ms-flexbox; 315 | display: flex; 316 | font-size: 10px; 317 | margin-left: 5px; 318 | padding: 0 2px; 319 | background-color: #fff; 320 | } 321 | 322 | .d2h-deleted-tag { 323 | border: #c33 1px solid; 324 | } 325 | 326 | .d2h-added-tag { 327 | border: #399839 1px solid; 328 | } 329 | 330 | .d2h-changed-tag { 331 | border: #d0b44c 1px solid; 332 | } 333 | 334 | .d2h-moved-tag { 335 | border: #3572b0 1px solid; 336 | } 337 | 338 | /* 339 | * Selection util. 340 | */ 341 | 342 | .selecting-left .d2h-code-line, 343 | .selecting-left .d2h-code-line *, 344 | .selecting-right td.d2h-code-linenumber, 345 | .selecting-right td.d2h-code-linenumber *, 346 | .selecting-left .d2h-code-side-line, 347 | .selecting-left .d2h-code-side-line *, 348 | .selecting-right td.d2h-code-side-linenumber, 349 | .selecting-right td.d2h-code-side-linenumber * { 350 | -webkit-touch-callout: none; 351 | -webkit-user-select: none; 352 | -moz-user-select: none; 353 | -ms-user-select: none; 354 | user-select: none; 355 | } 356 | 357 | .selecting-left .d2h-code-line::-moz-selection, 358 | .selecting-left .d2h-code-line *::-moz-selection, 359 | .selecting-right td.d2h-code-linenumber::-moz-selection, 360 | .selecting-left .d2h-code-side-line::-moz-selection, 361 | .selecting-left .d2h-code-side-line *::-moz-selection, 362 | .selecting-right td.d2h-code-side-linenumber::-moz-selection, 363 | .selecting-right td.d2h-code-side-linenumber *::-moz-selection { 364 | background: transparent; 365 | } 366 | 367 | .selecting-left .d2h-code-line::selection, 368 | .selecting-left .d2h-code-line *::selection, 369 | .selecting-right td.d2h-code-linenumber::selection, 370 | .selecting-left .d2h-code-side-line::selection, 371 | .selecting-left .d2h-code-side-line *::selection, 372 | .selecting-right td.d2h-code-side-linenumber::selection, 373 | .selecting-right td.d2h-code-side-linenumber *::selection { 374 | background: transparent; 375 | } 376 | 377 | /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91aS9jc3MvZGlmZjJodG1sLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRzs7QUFFSDtFQUNFLGlCQUFpQjtDQUNsQjs7QUFFRDtFQUNFLGtCQUFrQjtFQUNsQixpQ0FBaUM7RUFDakMsMEJBQTBCO0NBQzNCOztBQUVEO0VBQ0UscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLGdCQUFnQjtDQUNqQjs7QUFFRDtFQUNFLGtCQUFrQjtFQUNsQiwwQkFBMEI7RUFDMUIsMkJBQTJCO0VBQzNCLGVBQWU7RUFDZixhQUFhO0VBQ2IsdUJBQXVCO0NBQ3hCOztBQUVEO0VBQ0UsaUJBQWlCO0VBQ2pCLDBCQUEwQjtFQUMxQiwyQkFBMkI7RUFDM0IsWUFBWTtFQUNaLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsaUJBQWlCO0NBQ2xCOztBQUVEO0VBQ0UscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixjQUFjO0VBQ2QsMEJBQTBCO0VBQzFCLHVCQUF1QjtFQUN2QixvQkFBb0I7RUFDcEIsWUFBWTtFQUNaLCtFQUErRTtFQUMvRSxnQkFBZ0I7Q0FDakI7O0FBRUQ7RUFDRSxvQkFBb0I7RUFDcEIsd0JBQXdCO0VBQ3hCLG1CQUFtQjtFQUNuQixrQkFBa0I7Q0FDbkI7O0FBRUQ7RUFDRSx1QkFBdUI7RUFDdkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtDQUNwQjs7QUFFRDtFQUNFLFlBQVk7RUFDWiwwQkFBMEI7RUFDMUIsNENBQTRDO0VBQzVDLGdCQUFnQjtDQUNqQjs7QUFFRDtFQUNFLGFBQWE7RUFDYixrQkFBa0I7Q0FDbkI7O0FBRUQ7RUFDRSxlQUFlO0VBQ2YsWUFBWTtFQUNaLGFBQWE7Q0FDZDs7QUFFRDtFQUNFLG1CQUFtQjtFQUNuQixtQkFBbUI7Q0FDcEI7O0FBRUQ7RUFDRSxzQkFBc0I7RUFDdEIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLG9CQUFvQjtDQUNyQjs7QUFFRDtFQUNFLHNCQUFzQjtFQUN0QixvQkFBb0I7RUFDcEIsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtDQUNuQjs7QUFFRDtFQUNFLHNCQUFzQjtFQUN0QixvQkFBb0I7RUFDcEIsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtDQUNuQjs7QUFFRDs7RUFFRSxzQkFBc0I7RUFDdEIsaUJBQWlCO0VBQ2pCLHNCQUFzQjtFQUN0QiwwQkFBMEI7RUFDMUIscUJBQXFCO0NBQ3RCOztBQUVEOztFQUVFLHNCQUFzQjtFQUN0QixpQkFBaUI7RUFDakIsc0JBQXNCO0VBQ3RCLDBCQUEwQjtFQUMxQixxQkFBcUI7RUFDckIsaUJBQWlCO0NBQ2xCOztBQUVEO0VBQ0UsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLGlCQUFpQjtDQUNsQjs7QUFFRDtFQUNFLGdCQUFnQjtFQUNoQixpQkFBaUI7RUFDakIsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixpQkFBaUI7Q0FDbEI7O0FBRUQ7RUFDRSwrQkFBdUI7VUFBdkIsdUJBQXVCO0VBQ3ZCLFlBQVk7RUFDWixZQUFZO0VBQ1osaUJBQWlCO0VBQ2pCLHdCQUF3QjtFQUN4QixrQkFBa0I7Q0FDbkI7O0FBRUQ7RUFDRSwrQkFBdUI7VUFBdkIsdUJBQXVCO0VBQ3ZCLGFBQWE7RUFDYixZQUFZO0VBQ1osaUJBQWlCO0VBQ2pCLHdCQUF3QjtFQUN4QixrQkFBa0I7Q0FDbkI7O0FBRUQ7RUFDRSwrQkFBdUI7VUFBdkIsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQix1QkFBdUI7RUFDdkIsMEJBQTBCO0VBQzFCLGtCQUFrQjtFQUNsQixzQkFBc0I7RUFDdEIsMEJBQTBCO0VBQzFCLGdCQUFnQjtDQUNqQjs7QUFFRDtFQUNFLCtCQUF1QjtVQUF2Qix1QkFBdUI7RUFDdkIsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLHVCQUF1QjtFQUN2QiwwQkFBMEI7RUFDMUIsa0JBQWtCO0VBQ2xCLHNCQUFzQjtFQUN0QiwwQkFBMEI7RUFDMUIsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQix3QkFBd0I7Q0FDekI7O0FBRUQ7O0dBRUc7O0FBRUg7RUFDRSwwQkFBMEI7RUFDMUIsc0JBQXNCO0NBQ3ZCOztBQUVEO0VBQ0UsdUJBQXVCO0VBQ3ZCLHNCQUFzQjtDQUN2Qjs7QUFFRDtFQUNFLDBCQUEwQjtFQUMxQiwwQkFBMEI7RUFDMUIsc0JBQXNCO0NBQ3ZCOztBQUVEO0VBQ0UsMEJBQTBCO0NBQzNCOztBQUVEO0VBQ0UsdUJBQXVCO0NBQ3hCOztBQUVEOztHQUVHOztBQUVIO0VBQ0Usb0JBQW9CO0NBQ3JCOztBQUVEO0VBQ0Usc0JBQXNCO0VBQ3RCLGVBQWU7Q0FDaEI7O0FBRUQ7RUFDRSxlQUFlO0NBQ2hCOztBQUVEO0VBQ0UsaUJBQWlCO0NBQ2xCOztBQUVEO0VBQ0Usa0JBQWtCO0NBQ25COztBQUVEO0VBQ0UscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixjQUFjO0VBQ2QsaUJBQWlCO0NBQ2xCOztBQUVEO0VBQ0UsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsVUFBVTtDQUNYOztBQUVEO0VBQ0UsOEJBQThCO0VBQzlCLGtCQUFrQjtFQUNsQixVQUFVO0NBQ1g7O0FBRUQ7RUFDRSxvQkFBb0I7Q0FDckI7O0FBRUQ7RUFDRSxjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLGdCQUFnQjtDQUNqQjs7QUFFRDtFQUNFLGtCQUFrQjtDQUNuQjs7QUFFRDtFQUNFLHVCQUF1QjtFQUN2QixtQkFBbUI7RUFDbkIsbUJBQW1CO0NBQ3BCOztBQUVEO0VBQ0UsWUFBWTtDQUNiOztBQUVEO0VBQ0UsZUFBZTtDQUNoQjs7QUFFRDtFQUNFLGVBQWU7Q0FDaEI7O0FBRUQ7RUFDRSxlQUFlO0NBQ2hCOztBQUVEO0VBQ0UscUJBQXFCO0VBQ3JCLHFCQUFxQjtFQUNyQixjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2YsdUJBQXVCO0NBQ3hCOztBQUVEO0VBQ0UsdUJBQXVCO0NBQ3hCOztBQUVEO0VBQ0UsMEJBQTBCO0NBQzNCOztBQUVEO0VBQ0UsMEJBQTBCO0NBQzNCOztBQUVEO0VBQ0UsMEJBQTBCO0NBQzNCOztBQUVEOztHQUVHOztBQUVIOzs7Ozs7OztFQVFFLDRCQUE0QjtFQUM1QiwwQkFBMEI7RUFDMUIsdUJBQXVCO0VBQ3ZCLHNCQUFzQjtFQUN0QixrQkFBa0I7Q0FDbkI7O0FBRUQ7Ozs7Ozs7RUFPRSx3QkFBd0I7Q0FDekI7O0FBRUQ7Ozs7Ozs7RUFPRSx3QkFBd0I7Q0FDekIiLCJmaWxlIjoiZGlmZjJodG1sLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKlxuICogRGlmZiB0byBIVE1MIChkaWZmMmh0bWwuY3NzKVxuICogQXV0aG9yOiBydGZwZXNzb2FcbiAqXG4gKi9cblxuLmQyaC13cmFwcGVyIHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmQyaC1maWxlLWhlYWRlciB7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q4ZDhkODtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNztcbn1cblxuLmQyaC1maWxlLXN0YXRzIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG4uZDJoLWxpbmVzLWFkZGVkIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNiNGUyYjQ7XG4gIGJvcmRlci1yYWRpdXM6IDVweCAwIDAgNXB4O1xuICBjb2xvcjogIzM5OTgzOTtcbiAgcGFkZGluZzogMnB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4uZDJoLWxpbmVzLWRlbGV0ZWQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTlhZWFlO1xuICBib3JkZXItcmFkaXVzOiAwIDVweCA1cHggMDtcbiAgY29sb3I6ICNjMzM7XG4gIHBhZGRpbmc6IDJweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgbWFyZ2luLWxlZnQ6IDFweDtcbn1cblxuLmQyaC1maWxlLW5hbWUtd3JhcHBlciB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcbiAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIGZvbnQtZmFtaWx5OiBcIlNvdXJjZSBTYW5zIFByb1wiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cblxuLmQyaC1maWxlLW5hbWUge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBsaW5lLWhlaWdodDogMjFweDtcbn1cblxuLmQyaC1maWxlLXdyYXBwZXIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIG1hcmdpbi1ib3R0b206IDFlbTtcbn1cblxuLmQyaC1kaWZmLXRhYmxlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGZvbnQtZmFtaWx5OiBcIk1lbmxvXCIsIFwiQ29uc29sYXNcIiwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEzcHg7XG59XG5cbi5kMmgtZGlmZi10Ym9keSA+IHRyID4gdGQge1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xufVxuXG4uZDJoLWZpbGVzLWRpZmYge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLmQyaC1maWxlLWRpZmYge1xuICBvdmVyZmxvdy14OiBzY3JvbGw7XG4gIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cblxuLmQyaC1maWxlLXNpZGUtZGlmZiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgb3ZlcmZsb3cteDogc2Nyb2xsO1xuICBvdmVyZmxvdy15OiBoaWRkZW47XG4gIHdpZHRoOiA1MCU7XG4gIG1hcmdpbi1yaWdodDogLTRweDtcbiAgbWFyZ2luLWJvdHRvbTogLThweDtcbn1cblxuLmQyaC1jb2RlLWxpbmUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgbWFyZ2luLWxlZnQ6IDgwcHg7XG59XG5cbi5kMmgtY29kZS1zaWRlLWxpbmUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgbWFyZ2luLWxlZnQ6IDUwcHg7XG59XG5cbi5kMmgtY29kZS1saW5lIGRlbCxcbi5kMmgtY29kZS1zaWRlLWxpbmUgZGVsIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tdG9wOiAtMXB4O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmI2YmE7XG4gIGJvcmRlci1yYWRpdXM6IDAuMmVtO1xufVxuXG4uZDJoLWNvZGUtbGluZSBpbnMsXG4uZDJoLWNvZGUtc2lkZS1saW5lIGlucyB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLXRvcDogLTFweDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTdmMjk1O1xuICBib3JkZXItcmFkaXVzOiAwLjJlbTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmQyaC1jb2RlLWxpbmUtcHJlZml4IHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgd2hpdGUtc3BhY2U6IHByZTtcbn1cblxuLmQyaC1jb2RlLWxpbmUtY3RuIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgd2hpdGUtc3BhY2U6IHByZTtcbn1cblxuLmxpbmUtbnVtMSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogNDBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHBhZGRpbmctbGVmdDogM3B4O1xufVxuXG4ubGluZS1udW0yIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZmxvYXQ6IHJpZ2h0O1xuICB3aWR0aDogNDBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHBhZGRpbmctbGVmdDogM3B4O1xufVxuXG4uZDJoLWNvZGUtbGluZW51bWJlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDg2cHg7XG4gIHBhZGRpbmctbGVmdDogMnB4O1xuICBwYWRkaW5nLXJpZ2h0OiAycHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBib3JkZXI6IHNvbGlkICNlZWVlZWU7XG4gIGJvcmRlci13aWR0aDogMCAxcHggMCAxcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmQyaC1jb2RlLXNpZGUtbGluZW51bWJlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDU2cHg7XG4gIHBhZGRpbmctbGVmdDogNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBib3JkZXI6IHNvbGlkICNlZWVlZWU7XG4gIGJvcmRlci13aWR0aDogMCAxcHggMCAxcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XG5cbi8qXG4gKiBDaGFuZ2VzIEhpZ2hsaWdodFxuICovXG5cbi5kMmgtZGVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZThlOTtcbiAgYm9yZGVyLWNvbG9yOiAjZTlhZWFlO1xufVxuXG4uZDJoLWlucyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkZmQ7XG4gIGJvcmRlci1jb2xvcjogI2I0ZTJiNDtcbn1cblxuLmQyaC1pbmZvIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZmFmZDtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgYm9yZGVyLWNvbG9yOiAjZDVlNGYyO1xufVxuXG4uZDJoLWZpbGUtZGlmZiAuZDJoLWRlbC5kMmgtY2hhbmdlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjJkMDtcbn1cblxuLmQyaC1maWxlLWRpZmYgLmQyaC1pbnMuZDJoLWNoYW5nZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkZWQ7XG59XG5cbi8qXG4gKiBGaWxlIFN1bW1hcnkgTGlzdFxuICovXG5cbi5kMmgtZmlsZS1saXN0LXdyYXBwZXIge1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufVxuXG4uZDJoLWZpbGUtbGlzdC13cmFwcGVyIGEge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjMzU3MmIwO1xufVxuXG4uZDJoLWZpbGUtbGlzdC13cmFwcGVyIGE6dmlzaXRlZCB7XG4gIGNvbG9yOiAjMzU3MmIwO1xufVxuXG4uZDJoLWZpbGUtbGlzdC1oZWFkZXIge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uZDJoLWZpbGUtbGlzdC10aXRsZSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uZDJoLWZpbGUtbGlzdC1saW5lIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uZDJoLWZpbGUtbGlzdCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG59XG5cbi5kMmgtZmlsZS1saXN0ID4gbGkge1xuICBib3JkZXItYm90dG9tOiAjZGRkIHNvbGlkIDFweDtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIG1hcmdpbjogMDtcbn1cblxuLmQyaC1maWxlLWxpc3QgPiBsaTpsYXN0LWNoaWxkIHtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuLmQyaC1maWxlLXN3aXRjaCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZDJoLWljb24td3JhcHBlciB7XG4gIGxpbmUtaGVpZ2h0OiAzMXB4O1xufVxuXG4uZDJoLWljb24ge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gIGZpbGw6IGN1cnJlbnRDb2xvcjtcbn1cblxuLmQyaC1kZWxldGVkIHtcbiAgY29sb3I6ICNjMzM7XG59XG5cbi5kMmgtYWRkZWQge1xuICBjb2xvcjogIzM5OTgzOTtcbn1cblxuLmQyaC1jaGFuZ2VkIHtcbiAgY29sb3I6ICNkMGI0NGM7XG59XG5cbi5kMmgtbW92ZWQge1xuICBjb2xvcjogIzM1NzJiMDtcbn1cblxuLmQyaC10YWcge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgcGFkZGluZzogMCAycHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi5kMmgtZGVsZXRlZC10YWcge1xuICBib3JkZXI6ICNjMzMgMXB4IHNvbGlkO1xufVxuXG4uZDJoLWFkZGVkLXRhZyB7XG4gIGJvcmRlcjogIzM5OTgzOSAxcHggc29saWQ7XG59XG5cbi5kMmgtY2hhbmdlZC10YWcge1xuICBib3JkZXI6ICNkMGI0NGMgMXB4IHNvbGlkO1xufVxuXG4uZDJoLW1vdmVkLXRhZyB7XG4gIGJvcmRlcjogIzM1NzJiMCAxcHggc29saWQ7XG59XG5cbi8qXG4gKiBTZWxlY3Rpb24gdXRpbC5cbiAqL1xuXG4uc2VsZWN0aW5nLWxlZnQgLmQyaC1jb2RlLWxpbmUsXG4uc2VsZWN0aW5nLWxlZnQgLmQyaC1jb2RlLWxpbmUgKixcbi5zZWxlY3RpbmctcmlnaHQgdGQuZDJoLWNvZGUtbGluZW51bWJlcixcbi5zZWxlY3RpbmctcmlnaHQgdGQuZDJoLWNvZGUtbGluZW51bWJlciAqLFxuLnNlbGVjdGluZy1sZWZ0IC5kMmgtY29kZS1zaWRlLWxpbmUsXG4uc2VsZWN0aW5nLWxlZnQgLmQyaC1jb2RlLXNpZGUtbGluZSAqLFxuLnNlbGVjdGluZy1yaWdodCB0ZC5kMmgtY29kZS1zaWRlLWxpbmVudW1iZXIsXG4uc2VsZWN0aW5nLXJpZ2h0IHRkLmQyaC1jb2RlLXNpZGUtbGluZW51bWJlciAqIHtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uc2VsZWN0aW5nLWxlZnQgLmQyaC1jb2RlLWxpbmU6Oi1tb3otc2VsZWN0aW9uLFxuLnNlbGVjdGluZy1sZWZ0IC5kMmgtY29kZS1saW5lICo6Oi1tb3otc2VsZWN0aW9uLFxuLnNlbGVjdGluZy1yaWdodCB0ZC5kMmgtY29kZS1saW5lbnVtYmVyOjotbW96LXNlbGVjdGlvbixcbi5zZWxlY3RpbmctbGVmdCAuZDJoLWNvZGUtc2lkZS1saW5lOjotbW96LXNlbGVjdGlvbixcbi5zZWxlY3RpbmctbGVmdCAuZDJoLWNvZGUtc2lkZS1saW5lICo6Oi1tb3otc2VsZWN0aW9uLFxuLnNlbGVjdGluZy1yaWdodCB0ZC5kMmgtY29kZS1zaWRlLWxpbmVudW1iZXI6Oi1tb3otc2VsZWN0aW9uLFxuLnNlbGVjdGluZy1yaWdodCB0ZC5kMmgtY29kZS1zaWRlLWxpbmVudW1iZXIgKjo6LW1vei1zZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cblxuLnNlbGVjdGluZy1sZWZ0IC5kMmgtY29kZS1saW5lOjpzZWxlY3Rpb24sXG4uc2VsZWN0aW5nLWxlZnQgLmQyaC1jb2RlLWxpbmUgKjo6c2VsZWN0aW9uLFxuLnNlbGVjdGluZy1yaWdodCB0ZC5kMmgtY29kZS1saW5lbnVtYmVyOjpzZWxlY3Rpb24sXG4uc2VsZWN0aW5nLWxlZnQgLmQyaC1jb2RlLXNpZGUtbGluZTo6c2VsZWN0aW9uLFxuLnNlbGVjdGluZy1sZWZ0IC5kMmgtY29kZS1zaWRlLWxpbmUgKjo6c2VsZWN0aW9uLFxuLnNlbGVjdGluZy1yaWdodCB0ZC5kMmgtY29kZS1zaWRlLWxpbmVudW1iZXI6OnNlbGVjdGlvbixcbi5zZWxlY3RpbmctcmlnaHQgdGQuZDJoLWNvZGUtc2lkZS1saW5lbnVtYmVyICo6OnNlbGVjdGlvbiB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuIl19 */ -------------------------------------------------------------------------------- /dist/static/css/diff2html.min.css: -------------------------------------------------------------------------------- 1 | .d2h-wrapper{text-align:left}.d2h-file-header{padding:5px 10px;border-bottom:1px solid #d8d8d8;background-color:#f7f7f7}.d2h-file-stats{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto;font-size:14px}.d2h-lines-added{text-align:right;border:1px solid #b4e2b4;border-radius:5px 0 0 5px;color:#399839;padding:2px;vertical-align:middle}.d2h-lines-deleted{text-align:left;border:1px solid #e9aeae;border-radius:0 5px 5px 0;color:#c33;padding:2px;vertical-align:middle;margin-left:1px}.d2h-file-name-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;font-family:"Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px}.d2h-file-name{white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden;line-height:21px}.d2h-file-wrapper{border:1px solid #ddd;border-radius:3px;margin-bottom:1em}.d2h-diff-table{width:100%;border-collapse:collapse;font-family:Menlo,Consolas,monospace;font-size:13px}.d2h-diff-tbody>tr>td{height:20px;line-height:20px}.d2h-files-diff{display:block;width:100%;height:100%}.d2h-file-diff{overflow-x:scroll;overflow-y:hidden}.d2h-file-side-diff{display:inline-block;overflow-x:scroll;overflow-y:hidden;width:50%;margin-right:-4px;margin-bottom:-8px}.d2h-code-line{display:inline-block;white-space:nowrap;padding:0 10px;margin-left:80px}.d2h-code-side-line{display:inline-block;white-space:nowrap;padding:0 10px;margin-left:50px}.d2h-code-line del,.d2h-code-side-line del{display:inline-block;margin-top:-1px;text-decoration:none;background-color:#ffb6ba;border-radius:.2em}.d2h-code-line ins,.d2h-code-side-line ins{display:inline-block;margin-top:-1px;text-decoration:none;background-color:#97f295;border-radius:.2em;text-align:left}.d2h-code-line-prefix{display:inline;background:0 0;padding:0;word-wrap:normal;white-space:pre}.d2h-code-line-ctn{display:inline;background:0 0;padding:0;word-wrap:normal;white-space:pre}.line-num1{-webkit-box-sizing:border-box;box-sizing:border-box;float:left;width:40px;overflow:hidden;text-overflow:ellipsis;padding-left:3px}.line-num2{-webkit-box-sizing:border-box;box-sizing:border-box;float:right;width:40px;overflow:hidden;text-overflow:ellipsis;padding-left:3px}.d2h-code-linenumber{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;width:86px;padding-left:2px;padding-right:2px;background-color:#fff;color:rgba(0,0,0,.3);text-align:right;border:solid #eee;border-width:0 1px 0 1px;cursor:pointer}.d2h-code-side-linenumber{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;width:56px;padding-left:5px;padding-right:5px;background-color:#fff;color:rgba(0,0,0,.3);text-align:right;border:solid #eee;border-width:0 1px 0 1px;cursor:pointer;overflow:hidden;text-overflow:ellipsis}.d2h-del{background-color:#fee8e9;border-color:#e9aeae}.d2h-ins{background-color:#dfd;border-color:#b4e2b4}.d2h-info{background-color:#f8fafd;color:rgba(0,0,0,.3);border-color:#d5e4f2}.d2h-file-diff .d2h-del.d2h-change{background-color:#fdf2d0}.d2h-file-diff .d2h-ins.d2h-change{background-color:#ded}.d2h-file-list-wrapper{margin-bottom:10px}.d2h-file-list-wrapper a{text-decoration:none;color:#3572b0}.d2h-file-list-wrapper a:visited{color:#3572b0}.d2h-file-list-header{text-align:left}.d2h-file-list-title{font-weight:700}.d2h-file-list-line{display:-webkit-box;display:-ms-flexbox;display:flex;text-align:left}.d2h-file-list{display:block;list-style:none;padding:0;margin:0}.d2h-file-list>li{border-bottom:#ddd solid 1px;padding:5px 10px;margin:0}.d2h-file-list>li:last-child{border-bottom:none}.d2h-file-switch{display:none;font-size:10px;cursor:pointer}.d2h-icon-wrapper{line-height:31px}.d2h-icon{vertical-align:middle;margin-right:10px;fill:currentColor}.d2h-deleted{color:#c33}.d2h-added{color:#399839}.d2h-changed{color:#d0b44c}.d2h-moved{color:#3572b0}.d2h-tag{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:10px;margin-left:5px;padding:0 2px;background-color:#fff}.d2h-deleted-tag{border:#c33 1px solid}.d2h-added-tag{border:#399839 1px solid}.d2h-changed-tag{border:#d0b44c 1px solid}.d2h-moved-tag{border:#3572b0 1px solid}.selecting-left .d2h-code-line,.selecting-left .d2h-code-line *,.selecting-left .d2h-code-side-line,.selecting-left .d2h-code-side-line *,.selecting-right td.d2h-code-linenumber,.selecting-right td.d2h-code-linenumber *,.selecting-right td.d2h-code-side-linenumber,.selecting-right td.d2h-code-side-linenumber *{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.selecting-left .d2h-code-line ::-moz-selection,.selecting-left .d2h-code-line::-moz-selection,.selecting-left .d2h-code-side-line ::-moz-selection,.selecting-left .d2h-code-side-line::-moz-selection,.selecting-right td.d2h-code-linenumber::-moz-selection,.selecting-right td.d2h-code-side-linenumber ::-moz-selection,.selecting-right td.d2h-code-side-linenumber::-moz-selection{background:0 0}.selecting-left .d2h-code-line ::selection,.selecting-left .d2h-code-line::selection,.selecting-left .d2h-code-side-line ::selection,.selecting-left .d2h-code-side-line::selection,.selecting-right td.d2h-code-linenumber::selection,.selecting-right td.d2h-code-side-linenumber ::selection,.selecting-right td.d2h-code-side-linenumber::selection{background:0 0} -------------------------------------------------------------------------------- /dist/static/css/themes/default.css: -------------------------------------------------------------------------------- 1 | :root{--md-theme-default-primary:#448aff;--md-theme-default-accent:#ff5252;--md-theme-default-theme:"light"}.md-theme-default :not(input):not(textarea)::selection{background-color:#ff5252;background-color:var(--md-theme-default-accent-on-background, #ff5252);color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-theme-default a:not(.md-button){color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-theme-default a:not(.md-button):hover{color:rgba(68,138,255,0.8);color:var(--md-theme-default-primary-on-background, rgba(68,138,255,0.8))}.md-theme-default a:not(.md-button).md-accent{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-theme-default a:not(.md-button).md-accent:hover{color:rgba(255,82,82,0.8);color:var(--md-theme-default-accent-on-background, rgba(255,82,82,0.8))}html.md-theme-default{background-color:#fafafa;background-color:var(--md-theme-default-background-variant, #fafafa);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background-variant, rgba(0,0,0,0.87))}.md-theme-default .md-caption,.md-theme-default .md-display-1,.md-theme-default .md-display-2,.md-theme-default .md-display-3,.md-theme-default .md-display-4{color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-accent-on-background-variant, rgba(0,0,0,0.54))}.md-scrollbar.md-theme-default::-webkit-scrollbar-corner,.md-scrollbar.md-theme-default::-webkit-scrollbar-track{background:#e1e1e1;background:var(--md-theme-default-scrollbar-background-on-background-variant, #e1e1e1)}.md-scrollbar.md-theme-default::-webkit-scrollbar-thumb{background:#757575;background:var(--md-theme-default-scrollbar-on-background-variant, #757575)}.md-app:not(.md-overlap).md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-list.md-theme-default .md-autocomplete-items .md-highlight-text-match{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-list.md-theme-default .md-autocomplete-loading{background-color:rgba(255,255,255,0.54);background-color:var(--md-theme-default-background, rgba(255,255,255,0.54))}.md-autocomplete.md-theme-default.md-autocomplete-box{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-autocomplete.md-theme-default.md-autocomplete-box.md-focused label{color:rgba(0,0,0,0.38);color:var(--md-theme-default-text-hint-on-background, rgba(0,0,0,0.38))}.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box{background-color:rgba(255,255,255,0.12);background-color:var(--md-theme-default-background, rgba(255,255,255,0.12))}.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box label,.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box input{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff);-webkit-text-fill-color:#fff;-webkit-text-fill-color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box.md-focused{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box.md-focused label,.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box.md-focused input{color:rgba(0,0,0,0.38);color:var(--md-theme-default-text-hint-on-background, rgba(0,0,0,0.38));-webkit-text-fill-color:rgba(0,0,0,0.38);-webkit-text-fill-color:var(--md-theme-default-text-hint-on-background, rgba(0,0,0,0.38))}.md-toolbar .md-autocomplete.md-theme-default.md-autocomplete-box.md-focused svg{fill:rgba(0,0,0,0.38);fill:var(--md-theme-default-text-hint-on-background, rgba(0,0,0,0.38))}.md-autocomplete-box-content.md-theme-default:after{background-color:#fff;background-color:var(--md-theme-default-background, #fff);border-bottom-color:rgba(0,0,0,0.12);border-bottom-color:var(--md-theme-default-divider, rgba(0,0,0,0.12))}.md-avatar.md-theme-default.md-avatar-icon{background-color:rgba(0,0,0,0.38);background-color:var(--md-theme-default-icon-disabled, rgba(0,0,0,0.38));color:#fff;color:var(--md-theme-default-text-primary-on-icon-disabled, #fff)}.md-avatar.md-theme-default.md-avatar-icon .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-icon-disabled, #fff);fill:#fff;fill:var(--md-theme-default-text-primary-on-icon-disabled, #fff)}.md-avatar.md-theme-default.md-primary{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-avatar.md-theme-default.md-primary.md-avatar-icon{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-avatar.md-theme-default.md-primary.md-avatar-icon .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff);fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-avatar.md-theme-default.md-accent{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-avatar.md-theme-default.md-accent.md-avatar-icon{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252);color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-avatar.md-theme-default.md-accent.md-avatar-icon .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff);fill:#fff;fill:var(--md-theme-default-text-primary-on-accent, #fff)}.md-bottom-bar.md-theme-default.md-type-fixed{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-bottom-bar.md-theme-default.md-type-fixed .md-bottom-bar-item.md-active{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-bottom-bar.md-theme-default.md-type-fixed .md-bottom-bar-item.md-active .md-icon{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-bottom-bar.md-theme-default.md-type-fixed .md-bottom-bar-item.md-active .md-icon svg{fill:#448aff;fill:var(--md-theme-default-primary-on-background, #448aff)}.md-bottom-bar.md-theme-default.md-type-shift{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.7))}.md-bottom-bar.md-theme-default.md-type-shift>.md-ripple .md-ripple-wave{background-color:#116aff;background-color:var(--md-theme-default-primary-on-primary, #116aff)}.md-bottom-bar.md-theme-default.md-type-shift .md-icon{color:#fff;color:var(--md-theme-default-icon-on-primary, #fff)}.md-bottom-bar.md-theme-default.md-type-shift .md-icon svg{fill:#fff;fill:var(--md-theme-default-icon-on-primary, #fff)}.md-bottom-bar.md-theme-default.md-type-shift .md-bottom-bar-item{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-bottom-bar.md-theme-default.md-type-shift .md-bottom-bar-item .md-active .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-bottom-bar.md-theme-default.md-type-shift .md-bottom-bar-item .md-active .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-bottom-bar.md-theme-default.md-accent.md-type-fixed{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-bottom-bar.md-theme-default.md-accent.md-type-fixed .md-bottom-bar-item.md-active{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-bottom-bar.md-theme-default.md-accent.md-type-fixed .md-bottom-bar-item.md-active .md-icon{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-bottom-bar.md-theme-default.md-accent.md-type-fixed .md-bottom-bar-item.md-active .md-icon svg{fill:#ff5252;fill:var(--md-theme-default-accent-on-background, #ff5252)}.md-bottom-bar.md-theme-default.md-accent.md-type-shift{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252);color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.7))}.md-bottom-bar.md-theme-default.md-accent.md-type-shift>.md-ripple .md-ripple-wave{background-color:#ff1f1f;background-color:var(--md-theme-default-accent-on-accent, #ff1f1f)}.md-bottom-bar.md-theme-default.md-accent.md-type-shift .md-icon{color:#fff;color:var(--md-theme-default-icon-on-accent, #fff)}.md-bottom-bar.md-theme-default.md-accent.md-type-shift .md-icon svg{fill:#fff;fill:var(--md-theme-default-icon-on-accent, #fff)}.md-bottom-bar.md-theme-default.md-accent.md-type-shift .md-bottom-bar-item{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-bottom-bar.md-theme-default.md-accent.md-type-shift .md-bottom-bar-item .md-active .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-bottom-bar.md-theme-default.md-accent.md-type-shift .md-bottom-bar-item .md-active .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-accent, #fff)}.md-button.md-theme-default{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-button.md-theme-default.md-primary{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-button.md-theme-default.md-primary .md-icon-font{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-button.md-theme-default.md-primary .md-icon-image{fill:#448aff;fill:var(--md-theme-default-primary-on-background, #448aff)}.md-button.md-theme-default.md-accent{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-button.md-theme-default.md-accent .md-icon-font{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-button.md-theme-default.md-accent .md-icon-image{fill:#ff5252;fill:var(--md-theme-default-accent-on-background, #ff5252)}.md-button.md-theme-default.md-raised[disabled]{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-disabled-background-on-background, rgba(0,0,0,0.12));color:rgba(0,0,0,0.26);color:var(--md-theme-default-disabled, rgba(0,0,0,0.26))}.md-button.md-theme-default.md-raised:not([disabled]){background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-button.md-theme-default.md-raised:not([disabled]).md-primary{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff);background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-button.md-theme-default.md-raised:not([disabled]).md-primary .md-icon-font{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-button.md-theme-default.md-raised:not([disabled]).md-primary .md-icon-image{fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-button.md-theme-default.md-raised:not([disabled]).md-accent{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff);background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-button.md-theme-default.md-raised:not([disabled]).md-accent .md-icon-font{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-button.md-theme-default.md-raised:not([disabled]).md-accent .md-icon-image{fill:#fff;fill:var(--md-theme-default-text-primary-on-accent, #fff)}.md-button.md-theme-default.md-fab[disabled]{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-disabled-background-on-background, rgba(0,0,0,0.12))}.md-button.md-theme-default.md-fab:not([disabled]){background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-button.md-theme-default.md-fab:not([disabled]) .md-icon-font{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-button.md-theme-default.md-fab:not([disabled]) .md-icon-image{fill:#fff;fill:var(--md-theme-default-text-primary-on-accent, #fff)}.md-button.md-theme-default.md-fab:not([disabled]).md-primary{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-button.md-theme-default.md-fab:not([disabled]).md-primary .md-icon-font{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-button.md-theme-default.md-fab:not([disabled]).md-primary .md-icon-image{fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-button.md-theme-default[disabled]{color:rgba(0,0,0,0.26);color:var(--md-theme-default-disabled-on-background, rgba(0,0,0,0.26))}.md-button.md-theme-default[disabled] .md-icon-font{color:rgba(0,0,0,0.38);color:var(--md-theme-default-icon-disabled-on-background, rgba(0,0,0,0.38))}.md-button.md-theme-default[disabled] .md-icon-image{fill:rgba(0,0,0,0.38);fill:var(--md-theme-default-icon-disabled-on-background, rgba(0,0,0,0.38))}.md-card.md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-card.md-theme-default .md-card-expand .md-card-actions{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-card.md-theme-default .md-card-header .md-button:not(.md-primary):not(.md-accent),.md-card.md-theme-default .md-card-actions .md-button:not(.md-primary):not(.md-accent){color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-card.md-theme-default .md-card-header .md-button:not(.md-primary):not(.md-accent).md-icon-button .md-icon,.md-card.md-theme-default .md-card-actions .md-button:not(.md-primary):not(.md-accent).md-icon-button .md-icon{color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.54));fill:rgba(0,0,0,0.54);fill:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.54))}.md-card.md-theme-default>.md-card-area:after{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-card.md-theme-default.md-primary{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-card.md-theme-default.md-primary .md-card-expand .md-card-actions{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-card.md-theme-default.md-primary .md-card-header .md-button:not(.md-primary):not(.md-accent),.md-card.md-theme-default.md-primary .md-card-actions .md-button:not(.md-primary):not(.md-accent){color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-card.md-theme-default.md-primary .md-card-header .md-button:not(.md-primary):not(.md-accent).md-icon-button .md-icon,.md-card.md-theme-default.md-primary .md-card-actions .md-button:not(.md-primary):not(.md-accent).md-icon-button .md-icon{color:rgba(255,255,255,0.54);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.54));fill:rgba(255,255,255,0.54);fill:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.54))}.md-card.md-theme-default.md-primary>.md-card-area:after{background-color:rgba(255,255,255,0.12);background-color:var(--md-theme-default-divider-on-primary, rgba(255,255,255,0.12))}.md-card.md-theme-default.md-accent{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252);color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-card.md-theme-default.md-accent .md-card-expand .md-card-actions{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-card.md-theme-default.md-accent .md-card-header .md-button:not(.md-primary):not(.md-accent),.md-card.md-theme-default.md-accent .md-card-actions .md-button:not(.md-primary):not(.md-accent){color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-card.md-theme-default.md-accent .md-card-header .md-button:not(.md-primary):not(.md-accent).md-icon-button .md-icon,.md-card.md-theme-default.md-accent .md-card-actions .md-button:not(.md-primary):not(.md-accent).md-icon-button .md-icon{color:rgba(255,255,255,0.54);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.54));fill:rgba(255,255,255,0.54);fill:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.54))}.md-card.md-theme-default.md-accent>.md-card-area:after{background-color:rgba(255,255,255,0.12);background-color:var(--md-theme-default-divider-on-accent, rgba(255,255,255,0.12))}.md-checkbox.md-theme-default.md-checked .md-checkbox-container{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252);border-color:#ff5252;border-color:var(--md-theme-default-accent, #ff5252)}.md-checkbox.md-theme-default.md-checked .md-checkbox-container:after{border-color:#fff;border-color:var(--md-theme-default-background, #fff)}.md-checkbox.md-theme-default.md-checked .md-ripple{color:#ff5252;color:var(--md-theme-default-accent, #ff5252)}.md-checkbox.md-theme-default.md-checked.md-primary .md-checkbox-container{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);border-color:#448aff;border-color:var(--md-theme-default-primary, #448aff)}.md-checkbox.md-theme-default.md-checked.md-primary .md-ripple{color:#448aff;color:var(--md-theme-default-primary, #448aff)}.md-checkbox.md-theme-default .md-checkbox-container{border-color:rgba(0,0,0,0.54)}.md-checkbox.md-theme-default.md-disabled .md-checkbox-container{border-color:rgba(0,0,0,0.26)}.md-checkbox.md-theme-default.md-disabled.md-checked .md-checkbox-container{border-color:rgba(0,0,0,0.26);background-color:rgba(0,0,0,0.26)}.md-chip.md-theme-default{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-highlight, rgba(0,0,0,0.12));color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary, rgba(0,0,0,0.87))}.md-chip.md-theme-default .md-icon.md-icon-image svg{color:#fff;color:var(--md-theme-default-text-primary-on-text-primary, #fff);fill:#fff;fill:var(--md-theme-default-text-primary-on-text-primary, #fff)}.md-chip.md-theme-default.md-deletable:not(.md-disabled):hover,.md-chip.md-theme-default.md-clickable:not(.md-disabled):hover{background-color:rgba(0,0,0,0.54);background-color:var(--md-theme-default-icon, rgba(0,0,0,0.54));color:#fff;color:var(--md-theme-default-text-primary-on-icon, #fff)}.md-chip.md-theme-default.md-deletable:not(.md-disabled):hover .md-icon,.md-chip.md-theme-default.md-clickable:not(.md-disabled):hover .md-icon{fill:#fff;fill:var(--md-theme-default-text-primary-on-icon, #fff)}.md-chip.md-theme-default.md-deletable:not(.md-disabled):hover .md-input-action,.md-chip.md-theme-default.md-clickable:not(.md-disabled):hover .md-input-action{background-color:rgba(255,255,255,0.87);background-color:var(--md-theme-default-background, rgba(255,255,255,0.87));color:rgba(0,0,0,0.54);color:var(--md-theme-default-icon-on-background, rgba(0,0,0,0.54))}.md-chip.md-theme-default.md-deletable:not(.md-disabled):hover .md-input-action .md-icon svg,.md-chip.md-theme-default.md-clickable:not(.md-disabled):hover .md-input-action .md-icon svg{fill:rgba(0,0,0,0.54);fill:var(--md-theme-default-icon-on-background, rgba(0,0,0,0.54));color:rgba(0,0,0,0.54);color:var(--md-theme-default-icon-on-background, rgba(0,0,0,0.54))}.md-chip.md-theme-default.md-primary{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-chip.md-theme-default.md-primary .md-input-action{color:#fff;color:var(--md-theme-default-icon-on-disabled, #fff);background-color:rgba(0,0,0,0.26);background-color:var(--md-theme-default-disabled, rgba(0,0,0,0.26))}.md-chip.md-theme-default.md-primary.md-deletable:not(.md-disabled):hover,.md-chip.md-theme-default.md-primary.md-clickable:not(.md-disabled):hover{color:#fff;color:var(--md-theme-default-text-primary-on-icon, #fff);background-color:rgba(0,0,0,0.54);background-color:var(--md-theme-default-icon, rgba(0,0,0,0.54))}.md-chip.md-theme-default.md-primary.md-deletable:not(.md-disabled):hover .md-input-action,.md-chip.md-theme-default.md-primary.md-clickable:not(.md-disabled):hover .md-input-action{background-color:rgba(255,255,255,0.87);background-color:var(--md-theme-default-background, rgba(255,255,255,0.87))}.md-chip.md-theme-default.md-accent{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252);color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-chip.md-theme-default.md-accent .md-input-action{color:#fff;color:var(--md-theme-default-icon-on-disabled, #fff);background-color:rgba(0,0,0,0.26);background-color:var(--md-theme-default-disabled, rgba(0,0,0,0.26))}.md-chip.md-theme-default.md-accent.md-deletable:not(.md-disabled):hover,.md-chip.md-theme-default.md-accent.md-clickable:not(.md-disabled):hover{background-color:rgba(0,0,0,0.54);background-color:var(--md-theme-default-icon, rgba(0,0,0,0.54));color:#fff;color:var(--md-theme-default-text-primary-on-icon, #fff)}.md-chip.md-theme-default.md-accent.md-deletable:not(.md-disabled):hover .md-input-action,.md-chip.md-theme-default.md-accent.md-clickable:not(.md-disabled):hover .md-input-action{background-color:rgba(255,255,255,0.87);background-color:var(--md-theme-default-background, rgba(255,255,255,0.87))}.md-chip.md-theme-default.md-disabled{background-color:rgba(0,0,0,0.1);background-color:var(--md-theme-default-highlight, rgba(0,0,0,0.1));color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-accent, rgba(0,0,0,0.54))}.md-chips.md-theme-default .md-clear{background-color:rgba(0,0,0,0.2)}.md-content.md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-content.md-theme-default.md-primary{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-content.md-theme-default.md-accent{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252);color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-app .md-content.md-theme-default{border-left-color:rgba(0,0,0,0.12);border-left-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-datepicker-dialog.md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-datepicker-dialog.md-theme-default .md-datepicker-header{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-datepicker-dialog.md-theme-default .md-datepicker-body-header:after,.md-datepicker-dialog.md-theme-default .md-datepicker-body-header:before{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-datepicker-dialog.md-theme-default .md-datepicker-body-footer{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-datepicker-dialog.md-theme-default .md-datepicker-week{color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-accent-on-background, rgba(0,0,0,0.54))}.md-datepicker-dialog.md-theme-default .md-datepicker-disabled{color:rgba(0,0,0,0.26);color:var(--md-theme-default-disabled-on-background, rgba(0,0,0,0.26))}.md-datepicker-dialog.md-theme-default .md-datepicker-today{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-datepicker-dialog.md-theme-default .md-datepicker-day-button:hover,.md-datepicker-dialog.md-theme-default .md-datepicker-month-button:hover,.md-datepicker-dialog.md-theme-default .md-datepicker-year-button:hover{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-divider, rgba(0,0,0,0.12))}.md-datepicker-dialog.md-theme-default .md-datepicker-day-button.md-datepicker-selected{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-datepicker-dialog.md-theme-default .md-datepicker-month-button.md-datepicker-selected,.md-datepicker-dialog.md-theme-default .md-datepicker-year-button.md-datepicker-selected{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-datepicker-dialog.md-theme-default .md-datepicker-year-selector{border-bottom-color:rgba(0,0,0,0.12);border-bottom-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-dialog.md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-divider.md-theme-default{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-divider, rgba(0,0,0,0.12))}.md-drawer.md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-drawer.md-theme-default.md-persistent-mini{border-right-color:rgba(0,0,0,0.12);border-right-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-empty-state.md-theme-default .md-empty-state-icon.md-icon-image svg{fill:rgba(0,0,0,0.26);fill:var(--md-theme-default-disabled-on-background, rgba(0,0,0,0.26))}.md-empty-state.md-theme-default .md-empty-state-icon.md-icon-font{color:rgba(0,0,0,0.26);color:var(--md-theme-default-disabled-on-background, rgba(0,0,0,0.26))}.md-empty-state.md-theme-default.md-rounded{background-color:rgba(0,0,0,0.06);background-color:var(--md-theme-default-disabled, rgba(0,0,0,0.06))}.md-empty-state.md-theme-default.md-primary .md-empty-state-icon.md-icon-image svg{fill:#448aff;fill:var(--md-theme-default-primary-on-background, #448aff)}.md-empty-state.md-theme-default.md-primary .md-empty-state-icon.md-icon-font{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-empty-state.md-theme-default.md-accent .md-empty-state-icon.md-icon-image svg{fill:#ff5252;fill:var(--md-theme-default-accent-on-background, #ff5252)}.md-empty-state.md-theme-default.md-accent .md-empty-state-icon.md-icon-font{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-field.md-theme-default:after{background-color:rgba(0,0,0,0.42)}.md-field.md-theme-default:before{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-field.md-theme-default .md-helper-text,.md-field.md-theme-default .md-count,.md-field.md-theme-default label{color:rgba(0,0,0,0.54)}.md-field.md-theme-default .md-input::-webkit-input-placeholder,.md-field.md-theme-default .md-textarea::-webkit-input-placeholder{color:rgba(0,0,0,0.54)}.md-field.md-theme-default.md-focused .md-input,.md-field.md-theme-default.md-focused .md-textarea,.md-field.md-theme-default.md-has-value .md-input,.md-field.md-theme-default.md-has-value .md-textarea{-webkit-text-fill-color:rgba(0,0,0,0.87)}.md-field.md-theme-default.md-has-textarea:not(.md-autogrow):after{border-color:rgba(0,0,0,0.42)}.md-field.md-theme-default.md-has-textarea:not(.md-autogrow):before{border-color:#448aff;border-color:var(--md-theme-default-primary, #448aff)}.md-field.md-theme-default.md-disabled:after{background-image:linear-gradient(to right, rgba(0,0,0,0.38) 0%, rgba(0,0,0,0.38) 33%, transparent 0%)}.md-field.md-theme-default.md-disabled label,.md-field.md-theme-default.md-disabled .md-input,.md-field.md-theme-default.md-disabled .md-textarea{color:rgba(0,0,0,0.42)}.md-field.md-theme-default>.md-icon:after{background-color:#fafafa;background-color:var(--md-theme-default-background-variant, #fafafa)}.md-field.md-theme-default.md-invalid:after{background-color:#ff1744;background-color:var(--md-theme-default-fieldvariant, #ff1744)}.md-field.md-theme-default.md-invalid.md-has-textarea:not(.md-autogrow):before{border-color:#ff1744;border-color:var(--md-theme-default-fieldvariant, #ff1744)}.md-field.md-theme-default.md-invalid label{color:#ff1744;color:var(--md-theme-default-fieldvariant, #ff1744)}.md-field.md-theme-default.md-invalid .md-error{color:#ff1744;color:var(--md-theme-default-fieldvariant, #ff1744)}.md-field.md-theme-default.md-invalid .md-date-icon,.md-field.md-theme-default.md-invalid .md-date-icon svg{color:#ff1744;color:var(--md-theme-default-fieldvariant, #ff1744);fill:#ff1744;fill:var(--md-theme-default-fieldvariant, #ff1744)}.md-field.md-theme-default.md-focused .md-input,.md-field.md-theme-default.md-focused .md-textarea,.md-field.md-theme-default.md-highlight .md-input,.md-field.md-theme-default.md-highlight .md-textarea{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-field.md-theme-default.md-focused>.md-icon,.md-field.md-theme-default.md-highlight>.md-icon{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff);fill:#448aff;fill:var(--md-theme-default-primary-on-background, #448aff)}.md-field.md-theme-default.md-focused label{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-field.md-theme-default.md-disabled .md-icon svg{fill:rgba(0,0,0,0.26);fill:var(--md-theme-default-disabled-on-background, rgba(0,0,0,0.26))}.md-icon.md-theme-default.md-icon-image svg{fill:rgba(0,0,0,0.54);fill:var(--md-theme-default-icon-on-background, rgba(0,0,0,0.54))}.md-icon.md-theme-default.md-icon-image svg.md-primary{fill:#448aff;fill:var(--md-theme-default-primary-on-background, #448aff)}.md-icon.md-theme-default.md-icon-image svg.md-accent{fill:#ff5252;fill:var(--md-theme-default-accent-on-background, #ff5252)}.md-icon.md-theme-default.md-icon-font{color:rgba(0,0,0,0.54);color:var(--md-theme-default-icon-on-background, rgba(0,0,0,0.54))}.md-icon.md-theme-default.md-icon-font.md-primary{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-icon.md-theme-default.md-icon-font.md-accent{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-list.md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-list.md-theme-default.md-double-line .md-list-item-text :nth-child(2){color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-accent-on-background, rgba(0,0,0,0.54))}.md-list.md-theme-default.md-triple-line .md-list-item-text :nth-child(3){color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-accent-on-background, rgba(0,0,0,0.54))}.md-list.md-theme-default .md-highlight .md-list-item-container{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-list.md-theme-default .md-list-item-container{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-list.md-theme-default .md-list-item-container:not(.md-list-item-default):not([disabled]):hover{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12));color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-list.md-theme-default [disabled]{color:rgba(0,0,0,0.26);color:var(--md-theme-default-disabled-on-background, rgba(0,0,0,0.26))}.md-list.md-theme-default .md-selected .md-list-item-content,.md-list.md-theme-default .router-link-exact-active .md-list-item-content{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-list.md-theme-default .md-list-item-expand.md-active{border-color:rgba(0,0,0,0.12);border-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-menu-item.md-theme-default.md-primary .md-list-item-link,.md-menu-item.md-theme-default.md-primary .md-list-item-router,.md-menu-item.md-theme-default.md-primary .md-list-item-button{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-menu-item.md-theme-default.md-accent .md-list-item-link,.md-menu-item.md-theme-default.md-accent .md-list-item-router,.md-menu-item.md-theme-default.md-accent .md-list-item-button{color:#ff5252;color:var(--md-theme-default-accent-on-background, #ff5252)}.md-progress-bar.md-theme-default.md-indeterminate,.md-progress-bar.md-theme-default.md-query{background-color:rgba(68,138,255,0.38);background-color:var(--md-theme-default-primary-on-, rgba(68,138,255,0.38))}.md-progress-bar.md-theme-default.md-indeterminate .md-progress-bar-track:after,.md-progress-bar.md-theme-default.md-indeterminate .md-progress-bar-fill:after,.md-progress-bar.md-theme-default.md-query .md-progress-bar-track:after,.md-progress-bar.md-theme-default.md-query .md-progress-bar-fill:after{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-progress-bar.md-theme-default.md-indeterminate.md-accent,.md-progress-bar.md-theme-default.md-query.md-accent{background-color:rgba(255,82,82,0.38);background-color:var(--md-theme-default-accent-on-, rgba(255,82,82,0.38))}.md-progress-bar.md-theme-default.md-indeterminate.md-accent .md-progress-bar-track:after,.md-progress-bar.md-theme-default.md-indeterminate.md-accent .md-progress-bar-fill:after,.md-progress-bar.md-theme-default.md-query.md-accent .md-progress-bar-track:after,.md-progress-bar.md-theme-default.md-query.md-accent .md-progress-bar-fill:after{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-progress-bar.md-theme-default.md-determinate{background-color:rgba(68,138,255,0.38);background-color:var(--md-theme-default-primary-on-, rgba(68,138,255,0.38))}.md-progress-bar.md-theme-default.md-determinate .md-progress-bar-fill{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-progress-bar.md-theme-default.md-determinate.md-accent{background-color:rgba(255,82,82,0.38);background-color:var(--md-theme-default-accent-on-, rgba(255,82,82,0.38))}.md-progress-bar.md-theme-default.md-determinate.md-accent .md-progress-bar-fill{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-progress-bar.md-theme-default.md-buffer .md-progress-bar-fill{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-progress-bar.md-theme-default.md-buffer .md-progress-bar-track{background-color:rgba(68,138,255,0.38);background-color:var(--md-theme-default-primary-on-, rgba(68,138,255,0.38))}.md-progress-bar.md-theme-default.md-buffer .md-progress-bar-buffer{border-color:rgba(68,138,255,0.38);border-color:var(--md-theme-default-primary-on-, rgba(68,138,255,0.38))}.md-progress-bar.md-theme-default.md-buffer.md-accent .md-progress-bar-fill{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-progress-bar.md-theme-default.md-buffer.md-accent .md-progress-bar-track{background-color:rgba(255,82,82,0.38);background-color:var(--md-theme-default-accent-on-, rgba(255,82,82,0.38))}.md-progress-bar.md-theme-default.md-buffer.md-accent .md-progress-bar-buffer{border-color:rgba(255,82,82,0.38);border-color:var(--md-theme-default-accent-on-, rgba(255,82,82,0.38))}.md-progress-spinner.md-theme-default .md-progress-spinner-circle{stroke:#448aff;stroke:var(--md-theme-default-primary, #448aff)}.md-progress-spinner.md-theme-default.md-accent .md-progress-spinner-circle{stroke:#ff5252;stroke:var(--md-theme-default-accent, #ff5252)}.md-radio.md-theme-default.md-checked .md-radio-container{border-color:#ff5252;border-color:var(--md-theme-default-accent, #ff5252)}.md-radio.md-theme-default.md-checked .md-radio-container:after{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-radio.md-theme-default.md-checked .md-ripple{color:#ff5252;color:var(--md-theme-default-accent, #ff5252)}.md-radio.md-theme-default.md-checked.md-primary .md-radio-container{border-color:#448aff;border-color:var(--md-theme-default-primary, #448aff)}.md-radio.md-theme-default.md-checked.md-primary .md-radio-container:after{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-radio.md-theme-default.md-checked.md-primary .md-ripple{color:#448aff;color:var(--md-theme-default-primary, #448aff)}.md-radio.md-theme-default .md-radio-container{border-color:rgba(0,0,0,0.54)}.md-radio.md-theme-default.md-disabled .md-radio-container{border-color:rgba(0,0,0,0.26)}.md-radio.md-theme-default.md-disabled.md-checked .md-radio-container{border-color:rgba(0,0,0,0.26)}.md-radio.md-theme-default.md-disabled.md-checked .md-radio-container:after{background-color:rgba(0,0,0,0.26)}.md-snackbar.md-theme-default{color:#fff;color:var(--md-theme-default-text-primary-on-text-primary, #fff);background-color:#323232}.md-steppers.md-theme-default{background-color:#fff;background-color:var(--md-theme-default-background, #fff);color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-steppers.md-theme-default .md-stepper-icon:after,.md-steppers.md-theme-default .md-stepper-icon:before,.md-steppers.md-theme-default .md-stepper-number:after,.md-steppers.md-theme-default .md-stepper-number:before,.md-steppers.md-theme-default .md-stepper:after,.md-steppers.md-theme-default .md-stepper:before{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-steppers.md-theme-default .md-stepper-number{background-color:rgba(0,0,0,0.38);background-color:var(--md-theme-default-text-hint-on-background, rgba(0,0,0,0.38));color:#fff;color:var(--md-theme-default-text-primary-on-text-hint, #fff)}.md-steppers.md-theme-default .md-stepper-number svg{color:#fff;color:var(--md-theme-default-text-primary-on-text-hint, #fff);fill:#fff;fill:var(--md-theme-default-text-primary-on-text-hint, #fff)}.md-steppers.md-theme-default .md-stepper-header .md-button-content{color:rgba(0,0,0,0.38);color:var(--md-theme-default-text-hint-on-background, rgba(0,0,0,0.38))}.md-steppers.md-theme-default .md-stepper-header .md-button-content:after,.md-steppers.md-theme-default .md-stepper-header .md-button-content:before{background-color:rgba(0,0,0,0.12);background-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-steppers.md-theme-default .md-stepper-header.md-active .md-button-content,.md-steppers.md-theme-default .md-stepper-header.md-done .md-button-content{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-steppers.md-theme-default .md-stepper-header.md-active .md-stepper-number,.md-steppers.md-theme-default .md-stepper-header.md-done .md-stepper-number{background-color:#448aff;background-color:var(--md-theme-default-primary-on-background, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-steppers.md-theme-default .md-stepper-header.md-active .md-stepper-number svg,.md-steppers.md-theme-default .md-stepper-header.md-done .md-stepper-number svg{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff);fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-steppers.md-theme-default .md-stepper-header.md-error .md-button-content{color:#ff1744;color:var(--md-theme-default-steppervariant, #ff1744)}.md-steppers.md-theme-default .md-stepper-header.md-error .md-icon svg{color:#ff1744;color:var(--md-theme-default-steppervariant, #ff1744);fill:#ff1744;fill:var(--md-theme-default-steppervariant, #ff1744)}.md-subheader.md-theme-default{color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-accent-on-background, rgba(0,0,0,0.54))}.md-subheader.md-theme-default.md-primary{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-switch.md-theme-default.md-checked .md-switch-container{background-color:rgba(255,82,82,0.38);background-color:var(--md-theme-default-accent-on-, rgba(255,82,82,0.38))}.md-switch.md-theme-default.md-checked .md-switch-thumb{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252)}.md-switch.md-theme-default.md-checked .md-ripple{color:#ff5252;color:var(--md-theme-default-accent, #ff5252)}.md-switch.md-theme-default.md-checked.md-primary .md-switch-container{background-color:rgba(68,138,255,0.38);background-color:var(--md-theme-default-primary-on-, rgba(68,138,255,0.38))}.md-switch.md-theme-default.md-checked.md-primary .md-switch-thumb{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff)}.md-switch.md-theme-default.md-checked.md-primary .md-ripple{color:#448aff;color:var(--md-theme-default-primary, #448aff)}.md-switch.md-theme-default .md-switch-container{background-color:rgba(0,0,0,0.38)}.md-switch.md-theme-default .md-switch-thumb{background-color:#f5f5f5;background-color:var(--md-theme-default-switchvariant, #f5f5f5)}.md-switch.md-theme-default.md-disabled .md-switch-container{background-color:rgba(0,0,0,0.12)}.md-switch.md-theme-default.md-disabled .md-switch-thumb{background-color:#bdbdbd;background-color:var(--md-theme-default-switchvariant, #bdbdbd)}.md-table.md-theme-default .md-table-content,.md-table.md-theme-default .md-table-alternate-header{background-color:#fff;background-color:var(--md-theme-default-background, #fff)}.md-table.md-theme-default .md-table-alternate-header .md-table-toolbar{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87));background-color:rgba(255,82,82,0.2);background-color:var(--md-theme-default-accent-on-, rgba(255,82,82,0.2))}.md-table.md-theme-default .md-table-row:hover:not(.md-header-row) .md-table-cell{background-color:rgba(0,0,0,0.08);background-color:var(--md-theme-default-highlight-on-background, rgba(0,0,0,0.08))}.md-table.md-theme-default .md-table-row.md-selected,.md-table.md-theme-default .md-table-row.md-selected-single{background-color:#f5f5f5;background-color:var(--md-theme-default-rowvariant, #f5f5f5)}.md-table.md-theme-default .md-table-row.md-selected.md-primary,.md-table.md-theme-default .md-table-row.md-selected-single.md-primary{background-color:#448aff;background-color:var(--md-theme-default-primary-on-background, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-table.md-theme-default .md-table-row.md-selected.md-primary .md-ripple,.md-table.md-theme-default .md-table-row.md-selected-single.md-primary .md-ripple{color:#fff}.md-table.md-theme-default .md-table-row.md-selected.md-primary .md-checkbox-container,.md-table.md-theme-default .md-table-row.md-selected-single.md-primary .md-checkbox-container{background-color:#fff;border-color:#fff}.md-table.md-theme-default .md-table-row.md-selected.md-primary .md-checkbox-container:after,.md-table.md-theme-default .md-table-row.md-selected-single.md-primary .md-checkbox-container:after{border-color:#448aff;border-color:var(--md-theme-default-primary, #448aff)}.md-table.md-theme-default .md-table-row.md-selected.md-accent,.md-table.md-theme-default .md-table-row.md-selected-single.md-accent{background-color:#ff5252;background-color:var(--md-theme-default-accent-on-background, #ff5252);color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-table.md-theme-default .md-table-row.md-selected.md-accent .md-ripple,.md-table.md-theme-default .md-table-row.md-selected-single.md-accent .md-ripple{color:#fff}.md-table.md-theme-default .md-table-row.md-selected.md-accent .md-checkbox-container,.md-table.md-theme-default .md-table-row.md-selected-single.md-accent .md-checkbox-container{background-color:#fff;border-color:#fff}.md-table.md-theme-default .md-table-row.md-selected.md-accent .md-checkbox-container:after,.md-table.md-theme-default .md-table-row.md-selected-single.md-accent .md-checkbox-container:after{border-color:#ff5252;border-color:var(--md-theme-default-accent, #ff5252)}.md-table.md-theme-default .md-table-row td{border-top-color:rgba(0,0,0,0.12);border-top-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-table.md-theme-default .md-table-head{color:rgba(0,0,0,0.54);color:var(--md-theme-default-text-accent-on-background, rgba(0,0,0,0.54))}.md-table.md-theme-default .md-table-fixed-header-active{border-bottom-color:rgba(0,0,0,0.12);border-bottom-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-table.md-theme-default .md-sortable:hover,.md-table.md-theme-default .md-sortable.md-sorted{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-table.md-theme-default .md-sortable:hover svg,.md-table.md-theme-default .md-sortable.md-sorted svg{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87));fill:rgba(0,0,0,0.87);fill:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-table.md-theme-default .md-table-pagination{border-top-color:rgba(0,0,0,0.12);border-top-color:var(--md-theme-default-divider-on-background, rgba(0,0,0,0.12))}.md-tabs.md-theme-default .md-tabs-navigation{background-color:#fff;background-color:var(--md-theme-default-background-on-background, #fff)}.md-tabs.md-theme-default .md-tabs-navigation .md-button{color:rgba(0,0,0,0.7);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.7))}.md-tabs.md-theme-default .md-tabs-navigation .md-button[disabled]{color:rgba(0,0,0,0.38);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.38))}.md-tabs.md-theme-default .md-tabs-navigation .md-button .md-icon{color:rgba(0,0,0,0.7);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.7))}.md-tabs.md-theme-default .md-tabs-navigation .md-button .md-icon svg{fill:rgba(0,0,0,0.7);fill:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.7))}.md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active .md-icon{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active .md-icon svg{fill:#448aff;fill:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default .md-tabs-indicator{background-color:#448aff;background-color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation{background-color:#448aff;background-color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button[disabled]{color:rgba(255,255,255,0.38);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.38))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button .md-icon{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button .md-icon svg{fill:rgba(255,255,255,0.7);fill:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button.md-active{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button.md-active .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button.md-active .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-primary .md-tabs-indicator{background-color:#fff;background-color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation{background-color:#ff5252;background-color:var(--md-theme-default-accent-on-background, #ff5252)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button[disabled]{color:rgba(255,255,255,0.38);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.38))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button .md-icon{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button .md-icon svg{fill:rgba(255,255,255,0.7);fill:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button.md-active{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button.md-active .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button.md-active .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-accent, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-indicator{background-color:#fff;background-color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-tabs.md-theme-default .md-tabs-navigation{background-color:#fff;background-color:var(--md-theme-default-background-on-background, #fff)}.md-tabs.md-theme-default .md-tabs-navigation .md-button{color:rgba(0,0,0,0.7);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.7))}.md-tabs.md-theme-default .md-tabs-navigation .md-button[disabled]{color:rgba(0,0,0,0.38);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.38))}.md-tabs.md-theme-default .md-tabs-navigation .md-button .md-icon{color:rgba(0,0,0,0.7);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.7))}.md-tabs.md-theme-default .md-tabs-navigation .md-button .md-icon svg{fill:rgba(0,0,0,0.7);fill:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.7))}.md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active .md-icon{color:#448aff;color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default .md-tabs-navigation .md-button.md-active .md-icon svg{fill:#448aff;fill:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default .md-tabs-indicator{background-color:#448aff;background-color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation{background-color:#448aff;background-color:var(--md-theme-default-primary-on-background, #448aff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button[disabled]{color:rgba(255,255,255,0.38);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.38))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button .md-icon{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button .md-icon svg{fill:rgba(255,255,255,0.7);fill:var(--md-theme-default-text-primary-on-primary, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button.md-active{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button.md-active .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-primary .md-tabs-navigation .md-button.md-active .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-primary .md-tabs-indicator{background-color:#fff;background-color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation{background-color:#ff5252;background-color:var(--md-theme-default-accent-on-background, #ff5252)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button[disabled]{color:rgba(255,255,255,0.38);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.38))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button .md-icon{color:rgba(255,255,255,0.7);color:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button .md-icon svg{fill:rgba(255,255,255,0.7);fill:var(--md-theme-default-text-primary-on-accent, rgba(255,255,255,0.7))}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button.md-active{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button.md-active .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-navigation .md-button.md-active .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-accent, #fff)}.md-tabs.md-theme-default.md-accent .md-tabs-indicator{background-color:#fff;background-color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-toolbar.md-theme-default{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background-variant, rgba(0,0,0,0.87));background-color:#f5f5f5;background-color:var(--md-theme-default-toolbarvariant, #f5f5f5)}.md-toolbar.md-theme-default .md-icon{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background-variant, rgba(0,0,0,0.87))}.md-toolbar.md-theme-default .md-icon svg{fill:rgba(0,0,0,0.87);fill:var(--md-theme-default-text-primary-on-background-variant, rgba(0,0,0,0.87))}.md-toolbar.md-theme-default .md-title,.md-toolbar.md-theme-default .md-display-1,.md-toolbar.md-theme-default .md-display-2{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background-variant, rgba(0,0,0,0.87))}.md-toolbar.md-theme-default.md-primary{background-color:#448aff;background-color:var(--md-theme-default-primary, #448aff);color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-toolbar.md-theme-default.md-primary .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-toolbar.md-theme-default.md-primary .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-primary, #fff)}.md-toolbar.md-theme-default.md-primary .md-button:not([disabled]):not(.md-raised){color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-toolbar.md-theme-default.md-primary .md-title,.md-toolbar.md-theme-default.md-primary .md-display-1,.md-toolbar.md-theme-default.md-primary .md-display-2{color:#fff;color:var(--md-theme-default-text-primary-on-primary, #fff)}.md-toolbar.md-theme-default.md-accent{background-color:#ff5252;background-color:var(--md-theme-default-accent, #ff5252);color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-toolbar.md-theme-default.md-accent .md-icon{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-toolbar.md-theme-default.md-accent .md-icon svg{fill:#fff;fill:var(--md-theme-default-text-primary-on-accent, #fff)}.md-toolbar.md-theme-default.md-accent .md-button:not([disabled]):not(.md-raised){color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-toolbar.md-theme-default.md-accent .md-title,.md-toolbar.md-theme-default.md-accent .md-display-1,.md-toolbar.md-theme-default.md-accent .md-display-2{color:#fff;color:var(--md-theme-default-text-primary-on-accent, #fff)}.md-toolbar.md-theme-default.md-transparent{background-color:transparent;color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-toolbar.md-theme-default.md-transparent .md-icon{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-toolbar.md-theme-default.md-transparent .md-icon svg{fill:rgba(0,0,0,0.87);fill:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-toolbar.md-theme-default.md-transparent .md-title,.md-toolbar.md-theme-default.md-transparent .md-display-1,.md-toolbar.md-theme-default.md-transparent .md-display-2{color:rgba(0,0,0,0.87);color:var(--md-theme-default-text-primary-on-background, rgba(0,0,0,0.87))}.md-tooltip.md-theme-default{color:#fff;color:var(--md-theme-default-text-primary-on-tooltip, #fff);background-color:rgba(97,97,97,0.9);background-color:var(--md-theme-default-tooltip-on-background, rgba(97,97,97,0.9))} 2 | -------------------------------------------------------------------------------- /dist/static/iconfont/MaterialIcons-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberanid/diffido/1ddfb76c859ebd972138a28ea8d0c4856c139c3d/dist/static/iconfont/MaterialIcons-Regular.eot -------------------------------------------------------------------------------- /dist/static/iconfont/MaterialIcons-Regular.ijmap: -------------------------------------------------------------------------------- 1 | {"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} -------------------------------------------------------------------------------- /dist/static/iconfont/MaterialIcons-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberanid/diffido/1ddfb76c859ebd972138a28ea8d0c4856c139c3d/dist/static/iconfont/MaterialIcons-Regular.ttf -------------------------------------------------------------------------------- /dist/static/iconfont/MaterialIcons-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberanid/diffido/1ddfb76c859ebd972138a28ea8d0c4856c139c3d/dist/static/iconfont/MaterialIcons-Regular.woff -------------------------------------------------------------------------------- /dist/static/iconfont/MaterialIcons-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberanid/diffido/1ddfb76c859ebd972138a28ea8d0c4856c139c3d/dist/static/iconfont/MaterialIcons-Regular.woff2 -------------------------------------------------------------------------------- /dist/static/iconfont/README.md: -------------------------------------------------------------------------------- 1 | The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts: 2 | 3 | ```html 4 | 6 | ``` 7 | 8 | Read more in our full usage guide: 9 | http://google.github.io/material-design-icons/#icon-font-for-the-web 10 | -------------------------------------------------------------------------------- /dist/static/iconfont/codepoints: -------------------------------------------------------------------------------- 1 | 3d_rotation e84d 2 | ac_unit eb3b 3 | access_alarm e190 4 | access_alarms e191 5 | access_time e192 6 | accessibility e84e 7 | accessible e914 8 | account_balance e84f 9 | account_balance_wallet e850 10 | account_box e851 11 | account_circle e853 12 | adb e60e 13 | add e145 14 | add_a_photo e439 15 | add_alarm e193 16 | add_alert e003 17 | add_box e146 18 | add_circle e147 19 | add_circle_outline e148 20 | add_location e567 21 | add_shopping_cart e854 22 | add_to_photos e39d 23 | add_to_queue e05c 24 | adjust e39e 25 | airline_seat_flat e630 26 | airline_seat_flat_angled e631 27 | airline_seat_individual_suite e632 28 | airline_seat_legroom_extra e633 29 | airline_seat_legroom_normal e634 30 | airline_seat_legroom_reduced e635 31 | airline_seat_recline_extra e636 32 | airline_seat_recline_normal e637 33 | airplanemode_active e195 34 | airplanemode_inactive e194 35 | airplay e055 36 | airport_shuttle eb3c 37 | alarm e855 38 | alarm_add e856 39 | alarm_off e857 40 | alarm_on e858 41 | album e019 42 | all_inclusive eb3d 43 | all_out e90b 44 | android e859 45 | announcement e85a 46 | apps e5c3 47 | archive e149 48 | arrow_back e5c4 49 | arrow_downward e5db 50 | arrow_drop_down e5c5 51 | arrow_drop_down_circle e5c6 52 | arrow_drop_up e5c7 53 | arrow_forward e5c8 54 | arrow_upward e5d8 55 | art_track e060 56 | aspect_ratio e85b 57 | assessment e85c 58 | assignment e85d 59 | assignment_ind e85e 60 | assignment_late e85f 61 | assignment_return e860 62 | assignment_returned e861 63 | assignment_turned_in e862 64 | assistant e39f 65 | assistant_photo e3a0 66 | attach_file e226 67 | attach_money e227 68 | attachment e2bc 69 | audiotrack e3a1 70 | autorenew e863 71 | av_timer e01b 72 | backspace e14a 73 | backup e864 74 | battery_alert e19c 75 | battery_charging_full e1a3 76 | battery_full e1a4 77 | battery_std e1a5 78 | battery_unknown e1a6 79 | beach_access eb3e 80 | beenhere e52d 81 | block e14b 82 | bluetooth e1a7 83 | bluetooth_audio e60f 84 | bluetooth_connected e1a8 85 | bluetooth_disabled e1a9 86 | bluetooth_searching e1aa 87 | blur_circular e3a2 88 | blur_linear e3a3 89 | blur_off e3a4 90 | blur_on e3a5 91 | book e865 92 | bookmark e866 93 | bookmark_border e867 94 | border_all e228 95 | border_bottom e229 96 | border_clear e22a 97 | border_color e22b 98 | border_horizontal e22c 99 | border_inner e22d 100 | border_left e22e 101 | border_outer e22f 102 | border_right e230 103 | border_style e231 104 | border_top e232 105 | border_vertical e233 106 | branding_watermark e06b 107 | brightness_1 e3a6 108 | brightness_2 e3a7 109 | brightness_3 e3a8 110 | brightness_4 e3a9 111 | brightness_5 e3aa 112 | brightness_6 e3ab 113 | brightness_7 e3ac 114 | brightness_auto e1ab 115 | brightness_high e1ac 116 | brightness_low e1ad 117 | brightness_medium e1ae 118 | broken_image e3ad 119 | brush e3ae 120 | bubble_chart e6dd 121 | bug_report e868 122 | build e869 123 | burst_mode e43c 124 | business e0af 125 | business_center eb3f 126 | cached e86a 127 | cake e7e9 128 | call e0b0 129 | call_end e0b1 130 | call_made e0b2 131 | call_merge e0b3 132 | call_missed e0b4 133 | call_missed_outgoing e0e4 134 | call_received e0b5 135 | call_split e0b6 136 | call_to_action e06c 137 | camera e3af 138 | camera_alt e3b0 139 | camera_enhance e8fc 140 | camera_front e3b1 141 | camera_rear e3b2 142 | camera_roll e3b3 143 | cancel e5c9 144 | card_giftcard e8f6 145 | card_membership e8f7 146 | card_travel e8f8 147 | casino eb40 148 | cast e307 149 | cast_connected e308 150 | center_focus_strong e3b4 151 | center_focus_weak e3b5 152 | change_history e86b 153 | chat e0b7 154 | chat_bubble e0ca 155 | chat_bubble_outline e0cb 156 | check e5ca 157 | check_box e834 158 | check_box_outline_blank e835 159 | check_circle e86c 160 | chevron_left e5cb 161 | chevron_right e5cc 162 | child_care eb41 163 | child_friendly eb42 164 | chrome_reader_mode e86d 165 | class e86e 166 | clear e14c 167 | clear_all e0b8 168 | close e5cd 169 | closed_caption e01c 170 | cloud e2bd 171 | cloud_circle e2be 172 | cloud_done e2bf 173 | cloud_download e2c0 174 | cloud_off e2c1 175 | cloud_queue e2c2 176 | cloud_upload e2c3 177 | code e86f 178 | collections e3b6 179 | collections_bookmark e431 180 | color_lens e3b7 181 | colorize e3b8 182 | comment e0b9 183 | compare e3b9 184 | compare_arrows e915 185 | computer e30a 186 | confirmation_number e638 187 | contact_mail e0d0 188 | contact_phone e0cf 189 | contacts e0ba 190 | content_copy e14d 191 | content_cut e14e 192 | content_paste e14f 193 | control_point e3ba 194 | control_point_duplicate e3bb 195 | copyright e90c 196 | create e150 197 | create_new_folder e2cc 198 | credit_card e870 199 | crop e3be 200 | crop_16_9 e3bc 201 | crop_3_2 e3bd 202 | crop_5_4 e3bf 203 | crop_7_5 e3c0 204 | crop_din e3c1 205 | crop_free e3c2 206 | crop_landscape e3c3 207 | crop_original e3c4 208 | crop_portrait e3c5 209 | crop_rotate e437 210 | crop_square e3c6 211 | dashboard e871 212 | data_usage e1af 213 | date_range e916 214 | dehaze e3c7 215 | delete e872 216 | delete_forever e92b 217 | delete_sweep e16c 218 | description e873 219 | desktop_mac e30b 220 | desktop_windows e30c 221 | details e3c8 222 | developer_board e30d 223 | developer_mode e1b0 224 | device_hub e335 225 | devices e1b1 226 | devices_other e337 227 | dialer_sip e0bb 228 | dialpad e0bc 229 | directions e52e 230 | directions_bike e52f 231 | directions_boat e532 232 | directions_bus e530 233 | directions_car e531 234 | directions_railway e534 235 | directions_run e566 236 | directions_subway e533 237 | directions_transit e535 238 | directions_walk e536 239 | disc_full e610 240 | dns e875 241 | do_not_disturb e612 242 | do_not_disturb_alt e611 243 | do_not_disturb_off e643 244 | do_not_disturb_on e644 245 | dock e30e 246 | domain e7ee 247 | done e876 248 | done_all e877 249 | donut_large e917 250 | donut_small e918 251 | drafts e151 252 | drag_handle e25d 253 | drive_eta e613 254 | dvr e1b2 255 | edit e3c9 256 | edit_location e568 257 | eject e8fb 258 | email e0be 259 | enhanced_encryption e63f 260 | equalizer e01d 261 | error e000 262 | error_outline e001 263 | euro_symbol e926 264 | ev_station e56d 265 | event e878 266 | event_available e614 267 | event_busy e615 268 | event_note e616 269 | event_seat e903 270 | exit_to_app e879 271 | expand_less e5ce 272 | expand_more e5cf 273 | explicit e01e 274 | explore e87a 275 | exposure e3ca 276 | exposure_neg_1 e3cb 277 | exposure_neg_2 e3cc 278 | exposure_plus_1 e3cd 279 | exposure_plus_2 e3ce 280 | exposure_zero e3cf 281 | extension e87b 282 | face e87c 283 | fast_forward e01f 284 | fast_rewind e020 285 | favorite e87d 286 | favorite_border e87e 287 | featured_play_list e06d 288 | featured_video e06e 289 | feedback e87f 290 | fiber_dvr e05d 291 | fiber_manual_record e061 292 | fiber_new e05e 293 | fiber_pin e06a 294 | fiber_smart_record e062 295 | file_download e2c4 296 | file_upload e2c6 297 | filter e3d3 298 | filter_1 e3d0 299 | filter_2 e3d1 300 | filter_3 e3d2 301 | filter_4 e3d4 302 | filter_5 e3d5 303 | filter_6 e3d6 304 | filter_7 e3d7 305 | filter_8 e3d8 306 | filter_9 e3d9 307 | filter_9_plus e3da 308 | filter_b_and_w e3db 309 | filter_center_focus e3dc 310 | filter_drama e3dd 311 | filter_frames e3de 312 | filter_hdr e3df 313 | filter_list e152 314 | filter_none e3e0 315 | filter_tilt_shift e3e2 316 | filter_vintage e3e3 317 | find_in_page e880 318 | find_replace e881 319 | fingerprint e90d 320 | first_page e5dc 321 | fitness_center eb43 322 | flag e153 323 | flare e3e4 324 | flash_auto e3e5 325 | flash_off e3e6 326 | flash_on e3e7 327 | flight e539 328 | flight_land e904 329 | flight_takeoff e905 330 | flip e3e8 331 | flip_to_back e882 332 | flip_to_front e883 333 | folder e2c7 334 | folder_open e2c8 335 | folder_shared e2c9 336 | folder_special e617 337 | font_download e167 338 | format_align_center e234 339 | format_align_justify e235 340 | format_align_left e236 341 | format_align_right e237 342 | format_bold e238 343 | format_clear e239 344 | format_color_fill e23a 345 | format_color_reset e23b 346 | format_color_text e23c 347 | format_indent_decrease e23d 348 | format_indent_increase e23e 349 | format_italic e23f 350 | format_line_spacing e240 351 | format_list_bulleted e241 352 | format_list_numbered e242 353 | format_paint e243 354 | format_quote e244 355 | format_shapes e25e 356 | format_size e245 357 | format_strikethrough e246 358 | format_textdirection_l_to_r e247 359 | format_textdirection_r_to_l e248 360 | format_underlined e249 361 | forum e0bf 362 | forward e154 363 | forward_10 e056 364 | forward_30 e057 365 | forward_5 e058 366 | free_breakfast eb44 367 | fullscreen e5d0 368 | fullscreen_exit e5d1 369 | functions e24a 370 | g_translate e927 371 | gamepad e30f 372 | games e021 373 | gavel e90e 374 | gesture e155 375 | get_app e884 376 | gif e908 377 | golf_course eb45 378 | gps_fixed e1b3 379 | gps_not_fixed e1b4 380 | gps_off e1b5 381 | grade e885 382 | gradient e3e9 383 | grain e3ea 384 | graphic_eq e1b8 385 | grid_off e3eb 386 | grid_on e3ec 387 | group e7ef 388 | group_add e7f0 389 | group_work e886 390 | hd e052 391 | hdr_off e3ed 392 | hdr_on e3ee 393 | hdr_strong e3f1 394 | hdr_weak e3f2 395 | headset e310 396 | headset_mic e311 397 | healing e3f3 398 | hearing e023 399 | help e887 400 | help_outline e8fd 401 | high_quality e024 402 | highlight e25f 403 | highlight_off e888 404 | history e889 405 | home e88a 406 | hot_tub eb46 407 | hotel e53a 408 | hourglass_empty e88b 409 | hourglass_full e88c 410 | http e902 411 | https e88d 412 | image e3f4 413 | image_aspect_ratio e3f5 414 | import_contacts e0e0 415 | import_export e0c3 416 | important_devices e912 417 | inbox e156 418 | indeterminate_check_box e909 419 | info e88e 420 | info_outline e88f 421 | input e890 422 | insert_chart e24b 423 | insert_comment e24c 424 | insert_drive_file e24d 425 | insert_emoticon e24e 426 | insert_invitation e24f 427 | insert_link e250 428 | insert_photo e251 429 | invert_colors e891 430 | invert_colors_off e0c4 431 | iso e3f6 432 | keyboard e312 433 | keyboard_arrow_down e313 434 | keyboard_arrow_left e314 435 | keyboard_arrow_right e315 436 | keyboard_arrow_up e316 437 | keyboard_backspace e317 438 | keyboard_capslock e318 439 | keyboard_hide e31a 440 | keyboard_return e31b 441 | keyboard_tab e31c 442 | keyboard_voice e31d 443 | kitchen eb47 444 | label e892 445 | label_outline e893 446 | landscape e3f7 447 | language e894 448 | laptop e31e 449 | laptop_chromebook e31f 450 | laptop_mac e320 451 | laptop_windows e321 452 | last_page e5dd 453 | launch e895 454 | layers e53b 455 | layers_clear e53c 456 | leak_add e3f8 457 | leak_remove e3f9 458 | lens e3fa 459 | library_add e02e 460 | library_books e02f 461 | library_music e030 462 | lightbulb_outline e90f 463 | line_style e919 464 | line_weight e91a 465 | linear_scale e260 466 | link e157 467 | linked_camera e438 468 | list e896 469 | live_help e0c6 470 | live_tv e639 471 | local_activity e53f 472 | local_airport e53d 473 | local_atm e53e 474 | local_bar e540 475 | local_cafe e541 476 | local_car_wash e542 477 | local_convenience_store e543 478 | local_dining e556 479 | local_drink e544 480 | local_florist e545 481 | local_gas_station e546 482 | local_grocery_store e547 483 | local_hospital e548 484 | local_hotel e549 485 | local_laundry_service e54a 486 | local_library e54b 487 | local_mall e54c 488 | local_movies e54d 489 | local_offer e54e 490 | local_parking e54f 491 | local_pharmacy e550 492 | local_phone e551 493 | local_pizza e552 494 | local_play e553 495 | local_post_office e554 496 | local_printshop e555 497 | local_see e557 498 | local_shipping e558 499 | local_taxi e559 500 | location_city e7f1 501 | location_disabled e1b6 502 | location_off e0c7 503 | location_on e0c8 504 | location_searching e1b7 505 | lock e897 506 | lock_open e898 507 | lock_outline e899 508 | looks e3fc 509 | looks_3 e3fb 510 | looks_4 e3fd 511 | looks_5 e3fe 512 | looks_6 e3ff 513 | looks_one e400 514 | looks_two e401 515 | loop e028 516 | loupe e402 517 | low_priority e16d 518 | loyalty e89a 519 | mail e158 520 | mail_outline e0e1 521 | map e55b 522 | markunread e159 523 | markunread_mailbox e89b 524 | memory e322 525 | menu e5d2 526 | merge_type e252 527 | message e0c9 528 | mic e029 529 | mic_none e02a 530 | mic_off e02b 531 | mms e618 532 | mode_comment e253 533 | mode_edit e254 534 | monetization_on e263 535 | money_off e25c 536 | monochrome_photos e403 537 | mood e7f2 538 | mood_bad e7f3 539 | more e619 540 | more_horiz e5d3 541 | more_vert e5d4 542 | motorcycle e91b 543 | mouse e323 544 | move_to_inbox e168 545 | movie e02c 546 | movie_creation e404 547 | movie_filter e43a 548 | multiline_chart e6df 549 | music_note e405 550 | music_video e063 551 | my_location e55c 552 | nature e406 553 | nature_people e407 554 | navigate_before e408 555 | navigate_next e409 556 | navigation e55d 557 | near_me e569 558 | network_cell e1b9 559 | network_check e640 560 | network_locked e61a 561 | network_wifi e1ba 562 | new_releases e031 563 | next_week e16a 564 | nfc e1bb 565 | no_encryption e641 566 | no_sim e0cc 567 | not_interested e033 568 | note e06f 569 | note_add e89c 570 | notifications e7f4 571 | notifications_active e7f7 572 | notifications_none e7f5 573 | notifications_off e7f6 574 | notifications_paused e7f8 575 | offline_pin e90a 576 | ondemand_video e63a 577 | opacity e91c 578 | open_in_browser e89d 579 | open_in_new e89e 580 | open_with e89f 581 | pages e7f9 582 | pageview e8a0 583 | palette e40a 584 | pan_tool e925 585 | panorama e40b 586 | panorama_fish_eye e40c 587 | panorama_horizontal e40d 588 | panorama_vertical e40e 589 | panorama_wide_angle e40f 590 | party_mode e7fa 591 | pause e034 592 | pause_circle_filled e035 593 | pause_circle_outline e036 594 | payment e8a1 595 | people e7fb 596 | people_outline e7fc 597 | perm_camera_mic e8a2 598 | perm_contact_calendar e8a3 599 | perm_data_setting e8a4 600 | perm_device_information e8a5 601 | perm_identity e8a6 602 | perm_media e8a7 603 | perm_phone_msg e8a8 604 | perm_scan_wifi e8a9 605 | person e7fd 606 | person_add e7fe 607 | person_outline e7ff 608 | person_pin e55a 609 | person_pin_circle e56a 610 | personal_video e63b 611 | pets e91d 612 | phone e0cd 613 | phone_android e324 614 | phone_bluetooth_speaker e61b 615 | phone_forwarded e61c 616 | phone_in_talk e61d 617 | phone_iphone e325 618 | phone_locked e61e 619 | phone_missed e61f 620 | phone_paused e620 621 | phonelink e326 622 | phonelink_erase e0db 623 | phonelink_lock e0dc 624 | phonelink_off e327 625 | phonelink_ring e0dd 626 | phonelink_setup e0de 627 | photo e410 628 | photo_album e411 629 | photo_camera e412 630 | photo_filter e43b 631 | photo_library e413 632 | photo_size_select_actual e432 633 | photo_size_select_large e433 634 | photo_size_select_small e434 635 | picture_as_pdf e415 636 | picture_in_picture e8aa 637 | picture_in_picture_alt e911 638 | pie_chart e6c4 639 | pie_chart_outlined e6c5 640 | pin_drop e55e 641 | place e55f 642 | play_arrow e037 643 | play_circle_filled e038 644 | play_circle_outline e039 645 | play_for_work e906 646 | playlist_add e03b 647 | playlist_add_check e065 648 | playlist_play e05f 649 | plus_one e800 650 | poll e801 651 | polymer e8ab 652 | pool eb48 653 | portable_wifi_off e0ce 654 | portrait e416 655 | power e63c 656 | power_input e336 657 | power_settings_new e8ac 658 | pregnant_woman e91e 659 | present_to_all e0df 660 | print e8ad 661 | priority_high e645 662 | public e80b 663 | publish e255 664 | query_builder e8ae 665 | question_answer e8af 666 | queue e03c 667 | queue_music e03d 668 | queue_play_next e066 669 | radio e03e 670 | radio_button_checked e837 671 | radio_button_unchecked e836 672 | rate_review e560 673 | receipt e8b0 674 | recent_actors e03f 675 | record_voice_over e91f 676 | redeem e8b1 677 | redo e15a 678 | refresh e5d5 679 | remove e15b 680 | remove_circle e15c 681 | remove_circle_outline e15d 682 | remove_from_queue e067 683 | remove_red_eye e417 684 | remove_shopping_cart e928 685 | reorder e8fe 686 | repeat e040 687 | repeat_one e041 688 | replay e042 689 | replay_10 e059 690 | replay_30 e05a 691 | replay_5 e05b 692 | reply e15e 693 | reply_all e15f 694 | report e160 695 | report_problem e8b2 696 | restaurant e56c 697 | restaurant_menu e561 698 | restore e8b3 699 | restore_page e929 700 | ring_volume e0d1 701 | room e8b4 702 | room_service eb49 703 | rotate_90_degrees_ccw e418 704 | rotate_left e419 705 | rotate_right e41a 706 | rounded_corner e920 707 | router e328 708 | rowing e921 709 | rss_feed e0e5 710 | rv_hookup e642 711 | satellite e562 712 | save e161 713 | scanner e329 714 | schedule e8b5 715 | school e80c 716 | screen_lock_landscape e1be 717 | screen_lock_portrait e1bf 718 | screen_lock_rotation e1c0 719 | screen_rotation e1c1 720 | screen_share e0e2 721 | sd_card e623 722 | sd_storage e1c2 723 | search e8b6 724 | security e32a 725 | select_all e162 726 | send e163 727 | sentiment_dissatisfied e811 728 | sentiment_neutral e812 729 | sentiment_satisfied e813 730 | sentiment_very_dissatisfied e814 731 | sentiment_very_satisfied e815 732 | settings e8b8 733 | settings_applications e8b9 734 | settings_backup_restore e8ba 735 | settings_bluetooth e8bb 736 | settings_brightness e8bd 737 | settings_cell e8bc 738 | settings_ethernet e8be 739 | settings_input_antenna e8bf 740 | settings_input_component e8c0 741 | settings_input_composite e8c1 742 | settings_input_hdmi e8c2 743 | settings_input_svideo e8c3 744 | settings_overscan e8c4 745 | settings_phone e8c5 746 | settings_power e8c6 747 | settings_remote e8c7 748 | settings_system_daydream e1c3 749 | settings_voice e8c8 750 | share e80d 751 | shop e8c9 752 | shop_two e8ca 753 | shopping_basket e8cb 754 | shopping_cart e8cc 755 | short_text e261 756 | show_chart e6e1 757 | shuffle e043 758 | signal_cellular_4_bar e1c8 759 | signal_cellular_connected_no_internet_4_bar e1cd 760 | signal_cellular_no_sim e1ce 761 | signal_cellular_null e1cf 762 | signal_cellular_off e1d0 763 | signal_wifi_4_bar e1d8 764 | signal_wifi_4_bar_lock e1d9 765 | signal_wifi_off e1da 766 | sim_card e32b 767 | sim_card_alert e624 768 | skip_next e044 769 | skip_previous e045 770 | slideshow e41b 771 | slow_motion_video e068 772 | smartphone e32c 773 | smoke_free eb4a 774 | smoking_rooms eb4b 775 | sms e625 776 | sms_failed e626 777 | snooze e046 778 | sort e164 779 | sort_by_alpha e053 780 | spa eb4c 781 | space_bar e256 782 | speaker e32d 783 | speaker_group e32e 784 | speaker_notes e8cd 785 | speaker_notes_off e92a 786 | speaker_phone e0d2 787 | spellcheck e8ce 788 | star e838 789 | star_border e83a 790 | star_half e839 791 | stars e8d0 792 | stay_current_landscape e0d3 793 | stay_current_portrait e0d4 794 | stay_primary_landscape e0d5 795 | stay_primary_portrait e0d6 796 | stop e047 797 | stop_screen_share e0e3 798 | storage e1db 799 | store e8d1 800 | store_mall_directory e563 801 | straighten e41c 802 | streetview e56e 803 | strikethrough_s e257 804 | style e41d 805 | subdirectory_arrow_left e5d9 806 | subdirectory_arrow_right e5da 807 | subject e8d2 808 | subscriptions e064 809 | subtitles e048 810 | subway e56f 811 | supervisor_account e8d3 812 | surround_sound e049 813 | swap_calls e0d7 814 | swap_horiz e8d4 815 | swap_vert e8d5 816 | swap_vertical_circle e8d6 817 | switch_camera e41e 818 | switch_video e41f 819 | sync e627 820 | sync_disabled e628 821 | sync_problem e629 822 | system_update e62a 823 | system_update_alt e8d7 824 | tab e8d8 825 | tab_unselected e8d9 826 | tablet e32f 827 | tablet_android e330 828 | tablet_mac e331 829 | tag_faces e420 830 | tap_and_play e62b 831 | terrain e564 832 | text_fields e262 833 | text_format e165 834 | textsms e0d8 835 | texture e421 836 | theaters e8da 837 | thumb_down e8db 838 | thumb_up e8dc 839 | thumbs_up_down e8dd 840 | time_to_leave e62c 841 | timelapse e422 842 | timeline e922 843 | timer e425 844 | timer_10 e423 845 | timer_3 e424 846 | timer_off e426 847 | title e264 848 | toc e8de 849 | today e8df 850 | toll e8e0 851 | tonality e427 852 | touch_app e913 853 | toys e332 854 | track_changes e8e1 855 | traffic e565 856 | train e570 857 | tram e571 858 | transfer_within_a_station e572 859 | transform e428 860 | translate e8e2 861 | trending_down e8e3 862 | trending_flat e8e4 863 | trending_up e8e5 864 | tune e429 865 | turned_in e8e6 866 | turned_in_not e8e7 867 | tv e333 868 | unarchive e169 869 | undo e166 870 | unfold_less e5d6 871 | unfold_more e5d7 872 | update e923 873 | usb e1e0 874 | verified_user e8e8 875 | vertical_align_bottom e258 876 | vertical_align_center e259 877 | vertical_align_top e25a 878 | vibration e62d 879 | video_call e070 880 | video_label e071 881 | video_library e04a 882 | videocam e04b 883 | videocam_off e04c 884 | videogame_asset e338 885 | view_agenda e8e9 886 | view_array e8ea 887 | view_carousel e8eb 888 | view_column e8ec 889 | view_comfy e42a 890 | view_compact e42b 891 | view_day e8ed 892 | view_headline e8ee 893 | view_list e8ef 894 | view_module e8f0 895 | view_quilt e8f1 896 | view_stream e8f2 897 | view_week e8f3 898 | vignette e435 899 | visibility e8f4 900 | visibility_off e8f5 901 | voice_chat e62e 902 | voicemail e0d9 903 | volume_down e04d 904 | volume_mute e04e 905 | volume_off e04f 906 | volume_up e050 907 | vpn_key e0da 908 | vpn_lock e62f 909 | wallpaper e1bc 910 | warning e002 911 | watch e334 912 | watch_later e924 913 | wb_auto e42c 914 | wb_cloudy e42d 915 | wb_incandescent e42e 916 | wb_iridescent e436 917 | wb_sunny e430 918 | wc e63d 919 | web e051 920 | web_asset e069 921 | weekend e16b 922 | whatshot e80e 923 | widgets e1bd 924 | wifi e63e 925 | wifi_lock e1e1 926 | wifi_tethering e1e2 927 | work e8f9 928 | wrap_text e25b 929 | youtube_searched_for e8fa 930 | zoom_in e8ff 931 | zoom_out e900 932 | zoom_out_map e56b 933 | -------------------------------------------------------------------------------- /dist/static/iconfont/material-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Material Icons'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ 6 | src: local('Material Icons'), 7 | local('MaterialIcons-Regular'), 8 | url(MaterialIcons-Regular.woff2) format('woff2'), 9 | url(MaterialIcons-Regular.woff) format('woff'), 10 | url(MaterialIcons-Regular.ttf) format('truetype'); 11 | } 12 | 13 | .material-icons { 14 | font-family: 'Material Icons'; 15 | font-weight: normal; 16 | font-style: normal; 17 | font-size: 24px; /* Preferred icon size */ 18 | display: inline-block; 19 | line-height: 1; 20 | text-transform: none; 21 | letter-spacing: normal; 22 | word-wrap: normal; 23 | white-space: nowrap; 24 | direction: ltr; 25 | 26 | /* Support for all WebKit browsers. */ 27 | -webkit-font-smoothing: antialiased; 28 | /* Support for Safari and Chrome. */ 29 | text-rendering: optimizeLegibility; 30 | 31 | /* Support for Firefox. */ 32 | -moz-osx-font-smoothing: grayscale; 33 | 34 | /* Support for IE. */ 35 | font-feature-settings: 'liga'; 36 | } 37 | -------------------------------------------------------------------------------- /dist/static/js/axios.min.js: -------------------------------------------------------------------------------- 1 | /* axios v0.21.0 | (c) 2020 by Matt Zabriskie */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new i(e),n=s(i.prototype.request,t);return o.extend(n,i.prototype,t),o.extend(n,t),n}var o=n(2),s=n(3),i=n(4),a=n(22),u=n(10),c=r(u);c.Axios=i,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"undefined"==typeof e}function s(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function i(e){return"[object ArrayBuffer]"===R.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){if("[object Object]"!==R.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function l(e){return"[object Date]"===R.call(e)}function h(e){return"[object File]"===R.call(e)}function m(e){return"[object Blob]"===R.call(e)}function y(e){return"[object Function]"===R.call(e)}function g(e){return p(e)&&y(e.pipe)}function v(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function x(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function w(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function b(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},s.forEach(["delete","get","head"],function(e){u.headers[e]={}}),s.forEach(["post","put","patch"],function(e){u.headers[e]=s.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),s=n(16),i=n(5),a=n(17),u=n(20),c=n(21),f=n(14);e.exports=function(e){return new Promise(function(t,n){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(h+":"+m)}var y=a(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var r="getAllResponseHeaders"in l?u(l.getAllResponseHeaders()):null,s=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:s,status:l.status,statusText:l.statusText,headers:r,config:e,request:l};o(t,n,i),l=null}},l.onabort=function(){l&&(n(f("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){n(f("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(f(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=(e.withCredentials||c(y))&&e.xsrfCookieName?s.read(e.xsrfCookieName):void 0;g&&(d[e.xsrfHeaderName]=g)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),n(e),l=null)}),p||(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,s){var i=new Error(e);return r(i,t,n,o,s)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,s,i){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(s)&&a.push("domain="+s),i===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(18),o=n(19);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,s,i={};return e?(r.forEach(e.split("\n"),function(e){if(s=e.indexOf(":"),t=r.trim(e.substr(0,s)).toLowerCase(),n=r.trim(e.substr(s+1)),t){if(i[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?i[t]=(i[t]?i[t]:[]).concat([n]):i[t]=i[t]?i[t]+", "+n:n}}),i):i}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){function n(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function o(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(e[o],t[o])}t=t||{};var s={},i=["url","method","data"],a=["headers","auth","proxy","params"],u=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],c=["validateStatus"];r.forEach(i,function(e){r.isUndefined(t[e])||(s[e]=n(void 0,t[e]))}),r.forEach(a,o),r.forEach(u,function(o){r.isUndefined(t[o])?r.isUndefined(e[o])||(s[o]=n(void 0,e[o])):s[o]=n(void 0,t[o])}),r.forEach(c,function(r){r in t?s[r]=n(e[r],t[r]):r in e&&(s[r]=n(void 0,e[r]))});var f=i.concat(a).concat(u).concat(c),p=Object.keys(e).concat(Object.keys(t)).filter(function(e){return f.indexOf(e)===-1});return r.forEach(p,o),s}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); 3 | //# sourceMappingURL=axios.min.map -------------------------------------------------------------------------------- /docs/DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | # Diffido development 2 | 3 | ## API 4 | 5 | - /api/schedules GET - the list of all schedules 6 | - /api/schedules POST - add a new schedule 7 | - /api/schedules/reset POST - reset all schedules using the JSON configuration 8 | - /api/schedules/:id GET - get a single schedule 9 | - /api/schedules/:id PUT - update a schedule 10 | - /api/schedules/:id DELETE - delete a schedule 11 | - /api/schedules/:id/run POST - immediately run a schedule 12 | - /api/schedules/:id/history GET - get the history of a schedule 13 | - /api/schedules/:id/diff/:commit_id/:old_commit_id GET - get the diff from two commits of a schedule 14 | 15 | 16 | ## Data layout 17 | 18 | Information are stored in: 19 | 20 | - **conf/diffido.conf**: global options (Python syntax), can also be passed on the command line 21 | - **conf/schedules.json**: the JSON file used to store the schedules settings 22 | - **conf/jobs.db**: SQLite database used by APScheduler 23 | - **storage/**: git repositories, one for each schedule 24 | 25 | 26 | Coding style and conventions 27 | ---------------------------- 28 | 29 | It's enough to be consistent within the document you're editing. 30 | 31 | I suggest four spaces instead of tabs for all the code: Python (**mandatory**), JavaScript, HTML and CSS. 32 | 33 | Python code documented following the [Sphinx](http://sphinx-doc.org/) syntax. 34 | 35 | -------------------------------------------------------------------------------- /run-docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker build -t davidealberani/diffido . 4 | docker run --rm -it -v `pwd`/conf:/diffido/conf -v `pwd`/storage:/diffido/storage -p 3210:3210 davidealberani/diffido --debug 5 | 6 | -------------------------------------------------------------------------------- /ssl/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberanid/diffido/1ddfb76c859ebd972138a28ea8d0c4856c139c3d/ssl/.gitkeep -------------------------------------------------------------------------------- /storage/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberanid/diffido/1ddfb76c859ebd972138a28ea8d0c4856c139c3d/storage/.gitkeep --------------------------------------------------------------------------------