├── .github └── workflows │ └── main.yml ├── .gitignore ├── LICENCE ├── README.md ├── assets ├── css │ └── style.css ├── data │ ├── data.json │ └── rawdata.json ├── fonts │ └── material-design-icons │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ └── font │ │ ├── MaterialIcons-Regular.codepoints │ │ ├── MaterialIcons-Regular.ttf │ │ ├── MaterialIconsOutlined-Regular.codepoints │ │ ├── MaterialIconsOutlined-Regular.otf │ │ ├── MaterialIconsRound-Regular.codepoints │ │ ├── MaterialIconsRound-Regular.otf │ │ ├── MaterialIconsSharp-Regular.codepoints │ │ ├── MaterialIconsSharp-Regular.otf │ │ ├── MaterialIconsTwoTone-Regular.codepoints │ │ ├── MaterialIconsTwoTone-Regular.otf │ │ └── README.md ├── frameworks │ └── materialize │ │ ├── LICENSE │ │ ├── README.md │ │ ├── css │ │ ├── materialize.css │ │ └── materialize.min.css │ │ └── js │ │ ├── materialize.js │ │ └── materialize.min.js ├── images │ ├── icons │ │ ├── Icon-100.png │ │ ├── Icon-1024.png │ │ ├── Icon-114.png │ │ ├── Icon-120.png │ │ ├── Icon-128.png │ │ ├── Icon-144.png │ │ ├── Icon-152.png │ │ ├── Icon-16.png │ │ ├── Icon-167.png │ │ ├── Icon-172.png │ │ ├── Icon-180.png │ │ ├── Icon-196.png │ │ ├── Icon-20.png │ │ ├── Icon-256.png │ │ ├── Icon-29.png │ │ ├── Icon-32.png │ │ ├── Icon-40.png │ │ ├── Icon-48.png │ │ ├── Icon-50.png │ │ ├── Icon-512.png │ │ ├── Icon-55.png │ │ ├── Icon-57.png │ │ ├── Icon-58.png │ │ ├── Icon-60.png │ │ ├── Icon-64.png │ │ ├── Icon-72.png │ │ ├── Icon-76.png │ │ ├── Icon-80.png │ │ ├── Icon-87.png │ │ └── Icon-88.png │ └── linkpreview.jpg └── js │ ├── rawdata.js │ ├── script.js │ ├── script.js.map │ └── serviceWorkerInstaller.js ├── dsgvo.html ├── index.html ├── manifest.json ├── other ├── linkpreview.afdesign ├── logo.afdesign └── logo.png ├── service-worker.js ├── src ├── DVBHandler.ts ├── dataHandler.ts ├── distanceHandler.ts ├── general.ts ├── generators.ts ├── geoData.ts ├── httpFunctions.ts ├── refreshHandler.ts └── searchHandler.ts ├── tools ├── simpleconverter.html └── stationsNumberLokup.html └── tsconfig.json /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: github pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main # Set a branch name to trigger deployment 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-18.04 11 | steps: 12 | - uses: actions/checkout@v2 13 | with: 14 | submodules: true 15 | fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod 16 | 17 | - name: Deploy 18 | uses: peaceiris/actions-gh-pages@v3 19 | with: 20 | deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} 21 | publish_dir: ./ 22 | external_repository: dvbfast/dvbfast.github.io 23 | publish_branch: gh-pages 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/macos,node,windows,reactnative 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos,node,windows,reactnative 4 | 5 | ### macOS ### 6 | # General 7 | .DS_Store 8 | .AppleDouble 9 | .LSOverride 10 | 11 | # Icon must end with two \r 12 | Icon 13 | 14 | 15 | # Thumbnails 16 | ._* 17 | 18 | # Files that might appear in the root of a volume 19 | .DocumentRevisions-V100 20 | .fseventsd 21 | .Spotlight-V100 22 | .TemporaryItems 23 | .Trashes 24 | .VolumeIcon.icns 25 | .com.apple.timemachine.donotpresent 26 | 27 | # Directories potentially created on remote AFP share 28 | .AppleDB 29 | .AppleDesktop 30 | Network Trash Folder 31 | Temporary Items 32 | .apdisk 33 | 34 | ### Node ### 35 | # Logs 36 | logs 37 | *.log 38 | npm-debug.log* 39 | yarn-debug.log* 40 | yarn-error.log* 41 | lerna-debug.log* 42 | 43 | # Diagnostic reports (https://nodejs.org/api/report.html) 44 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 45 | 46 | # Runtime data 47 | pids 48 | *.pid 49 | *.seed 50 | *.pid.lock 51 | 52 | # Directory for instrumented libs generated by jscoverage/JSCover 53 | lib-cov 54 | 55 | # Coverage directory used by tools like istanbul 56 | coverage 57 | *.lcov 58 | 59 | # nyc test coverage 60 | .nyc_output 61 | 62 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 63 | .grunt 64 | 65 | # Bower dependency directory (https://bower.io/) 66 | bower_components 67 | 68 | # node-waf configuration 69 | .lock-wscript 70 | 71 | # Compiled binary addons (https://nodejs.org/api/addons.html) 72 | build/Release 73 | 74 | # Dependency directories 75 | node_modules/ 76 | jspm_packages/ 77 | 78 | # TypeScript v1 declaration files 79 | typings/ 80 | 81 | # TypeScript cache 82 | *.tsbuildinfo 83 | 84 | # Optional npm cache directory 85 | .npm 86 | 87 | # Optional eslint cache 88 | .eslintcache 89 | 90 | # Microbundle cache 91 | .rpt2_cache/ 92 | .rts2_cache_cjs/ 93 | .rts2_cache_es/ 94 | .rts2_cache_umd/ 95 | 96 | # Optional REPL history 97 | .node_repl_history 98 | 99 | # Output of 'npm pack' 100 | *.tgz 101 | 102 | # Yarn Integrity file 103 | .yarn-integrity 104 | 105 | # dotenv environment variables file 106 | .env 107 | .env.test 108 | .env*.local 109 | 110 | # parcel-bundler cache (https://parceljs.org/) 111 | .cache 112 | .parcel-cache 113 | 114 | # Next.js build output 115 | .next 116 | 117 | # Nuxt.js build / generate output 118 | .nuxt 119 | dist 120 | 121 | # Gatsby files 122 | .cache/ 123 | # Comment in the public line in if your project uses Gatsby and not Next.js 124 | # https://nextjs.org/blog/next-9-1#public-directory-support 125 | # public 126 | 127 | # vuepress build output 128 | .vuepress/dist 129 | 130 | # Serverless directories 131 | .serverless/ 132 | 133 | # FuseBox cache 134 | .fusebox/ 135 | 136 | # DynamoDB Local files 137 | .dynamodb/ 138 | 139 | # TernJS port file 140 | .tern-port 141 | 142 | # Stores VSCode versions used for testing VSCode extensions 143 | .vscode-test 144 | 145 | ### ReactNative ### 146 | # React Native Stack Base 147 | 148 | .expo 149 | __generated__ 150 | 151 | ### ReactNative.Android Stack ### 152 | # Built application files 153 | *.apk 154 | *.aar 155 | *.ap_ 156 | *.aab 157 | 158 | # Files for the ART/Dalvik VM 159 | *.dex 160 | 161 | # Java class files 162 | *.class 163 | 164 | # Generated files 165 | bin/ 166 | gen/ 167 | out/ 168 | # Uncomment the following line in case you need and you don't have the release build type files in your app 169 | # release/ 170 | 171 | # Gradle files 172 | .gradle/ 173 | build/ 174 | 175 | # Local configuration file (sdk path, etc) 176 | local.properties 177 | 178 | # Proguard folder generated by Eclipse 179 | proguard/ 180 | 181 | # Log Files 182 | 183 | # Android Studio Navigation editor temp files 184 | .navigation/ 185 | 186 | # Android Studio captures folder 187 | captures/ 188 | 189 | # IntelliJ 190 | *.iml 191 | .idea/workspace.xml 192 | .idea/tasks.xml 193 | .idea/gradle.xml 194 | .idea/assetWizardSettings.xml 195 | .idea/dictionaries 196 | .idea/libraries 197 | # Android Studio 3 in .gitignore file. 198 | .idea/caches 199 | .idea/modules.xml 200 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you 201 | .idea/navEditor.xml 202 | 203 | # Keystore files 204 | # Uncomment the following lines if you do not want to check your keystore files in. 205 | #*.jks 206 | #*.keystore 207 | 208 | # External native build folder generated in Android Studio 2.2 and later 209 | .externalNativeBuild 210 | .cxx/ 211 | 212 | # Google Services (e.g. APIs or Firebase) 213 | # google-services.json 214 | 215 | # Freeline 216 | freeline.py 217 | freeline/ 218 | freeline_project_description.json 219 | 220 | # fastlane 221 | fastlane/report.xml 222 | fastlane/Preview.html 223 | fastlane/screenshots 224 | fastlane/test_output 225 | fastlane/readme.md 226 | 227 | # Version control 228 | vcs.xml 229 | 230 | # lint 231 | lint/intermediates/ 232 | lint/generated/ 233 | lint/outputs/ 234 | lint/tmp/ 235 | # lint/reports/ 236 | 237 | ### ReactNative.Buck Stack ### 238 | buck-out/ 239 | .buckconfig.local 240 | .buckd/ 241 | .buckversion 242 | .fakebuckversion 243 | 244 | ### ReactNative.Gradle Stack ### 245 | .gradle 246 | 247 | # Ignore Gradle GUI config 248 | gradle-app.setting 249 | 250 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 251 | !gradle-wrapper.jar 252 | 253 | # Cache of project 254 | .gradletasknamecache 255 | 256 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 257 | # gradle/wrapper/gradle-wrapper.properties 258 | 259 | ### ReactNative.Linux Stack ### 260 | *~ 261 | 262 | # temporary files which can be created if a process still has a handle open of a deleted file 263 | .fuse_hidden* 264 | 265 | # KDE directory preferences 266 | .directory 267 | 268 | # Linux trash folder which might appear on any partition or disk 269 | .Trash-* 270 | 271 | # .nfs files are created when an open file is removed but is still being accessed 272 | .nfs* 273 | 274 | ### ReactNative.Node Stack ### 275 | # Logs 276 | 277 | # Diagnostic reports (https://nodejs.org/api/report.html) 278 | 279 | # Runtime data 280 | 281 | # Directory for instrumented libs generated by jscoverage/JSCover 282 | 283 | # Coverage directory used by tools like istanbul 284 | 285 | # nyc test coverage 286 | 287 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 288 | 289 | # Bower dependency directory (https://bower.io/) 290 | 291 | # node-waf configuration 292 | 293 | # Compiled binary addons (https://nodejs.org/api/addons.html) 294 | 295 | # Dependency directories 296 | 297 | # TypeScript v1 declaration files 298 | 299 | # TypeScript cache 300 | 301 | # Optional npm cache directory 302 | 303 | # Optional eslint cache 304 | 305 | # Microbundle cache 306 | 307 | # Optional REPL history 308 | 309 | # Output of 'npm pack' 310 | 311 | # Yarn Integrity file 312 | 313 | # dotenv environment variables file 314 | 315 | # parcel-bundler cache (https://parceljs.org/) 316 | 317 | # Next.js build output 318 | 319 | # Nuxt.js build / generate output 320 | 321 | # Gatsby files 322 | # Comment in the public line in if your project uses Gatsby and not Next.js 323 | # https://nextjs.org/blog/next-9-1#public-directory-support 324 | # public 325 | 326 | # vuepress build output 327 | 328 | # Serverless directories 329 | 330 | # FuseBox cache 331 | 332 | # DynamoDB Local files 333 | 334 | # TernJS port file 335 | 336 | # Stores VSCode versions used for testing VSCode extensions 337 | 338 | ### ReactNative.Xcode Stack ### 339 | # Xcode 340 | # 341 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 342 | 343 | ## User settings 344 | xcuserdata/ 345 | 346 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 347 | *.xcscmblueprint 348 | *.xccheckout 349 | 350 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 351 | DerivedData/ 352 | *.moved-aside 353 | *.pbxuser 354 | !default.pbxuser 355 | *.mode1v3 356 | !default.mode1v3 357 | *.mode2v3 358 | !default.mode2v3 359 | *.perspectivev3 360 | !default.perspectivev3 361 | 362 | ## Gcc Patch 363 | /*.gcno 364 | 365 | ### ReactNative.macOS Stack ### 366 | # General 367 | 368 | # Icon must end with two \r 369 | 370 | # Thumbnails 371 | 372 | # Files that might appear in the root of a volume 373 | 374 | # Directories potentially created on remote AFP share 375 | 376 | ### Windows ### 377 | # Windows thumbnail cache files 378 | Thumbs.db 379 | Thumbs.db:encryptable 380 | ehthumbs.db 381 | ehthumbs_vista.db 382 | 383 | # Dump file 384 | *.stackdump 385 | 386 | # Folder config file 387 | [Dd]esktop.ini 388 | 389 | # Recycle Bin used on file shares 390 | $RECYCLE.BIN/ 391 | 392 | # Windows Installer files 393 | *.cab 394 | *.msi 395 | *.msix 396 | *.msm 397 | *.msp 398 | 399 | # Windows shortcuts 400 | *.lnk 401 | 402 | # End of https://www.toptal.com/developers/gitignore/api/macos,node,windows,reactnative 403 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | Attribution-NonCommercial-ShareAlike 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International 58 | Public License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-NonCommercial-ShareAlike 4.0 International Public License 63 | ("Public License"). To the extent this Public License may be 64 | interpreted as a contract, You are granted the Licensed Rights in 65 | consideration of Your acceptance of these terms and conditions, and the 66 | Licensor grants You such rights in consideration of benefits the 67 | Licensor receives from making the Licensed Material available under 68 | these terms and conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. BY-NC-SA Compatible License means a license listed at 88 | creativecommons.org/compatiblelicenses, approved by Creative 89 | Commons as essentially the equivalent of this Public License. 90 | 91 | d. Copyright and Similar Rights means copyright and/or similar rights 92 | closely related to copyright including, without limitation, 93 | performance, broadcast, sound recording, and Sui Generis Database 94 | Rights, without regard to how the rights are labeled or 95 | categorized. For purposes of this Public License, the rights 96 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 | Rights. 98 | 99 | e. Effective Technological Measures means those measures that, in the 100 | absence of proper authority, may not be circumvented under laws 101 | fulfilling obligations under Article 11 of the WIPO Copyright 102 | Treaty adopted on December 20, 1996, and/or similar international 103 | agreements. 104 | 105 | f. Exceptions and Limitations means fair use, fair dealing, and/or 106 | any other exception or limitation to Copyright and Similar Rights 107 | that applies to Your use of the Licensed Material. 108 | 109 | g. License Elements means the license attributes listed in the name 110 | of a Creative Commons Public License. The License Elements of this 111 | Public License are Attribution, NonCommercial, and ShareAlike. 112 | 113 | h. Licensed Material means the artistic or literary work, database, 114 | or other material to which the Licensor applied this Public 115 | License. 116 | 117 | i. Licensed Rights means the rights granted to You subject to the 118 | terms and conditions of this Public License, which are limited to 119 | all Copyright and Similar Rights that apply to Your use of the 120 | Licensed Material and that the Licensor has authority to license. 121 | 122 | j. Licensor means the individual(s) or entity(ies) granting rights 123 | under this Public License. 124 | 125 | k. NonCommercial means not primarily intended for or directed towards 126 | commercial advantage or monetary compensation. For purposes of 127 | this Public License, the exchange of the Licensed Material for 128 | other material subject to Copyright and Similar Rights by digital 129 | file-sharing or similar means is NonCommercial provided there is 130 | no payment of monetary compensation in connection with the 131 | exchange. 132 | 133 | l. Share means to provide material to the public by any means or 134 | process that requires permission under the Licensed Rights, such 135 | as reproduction, public display, public performance, distribution, 136 | dissemination, communication, or importation, and to make material 137 | available to the public including in ways that members of the 138 | public may access the material from a place and at a time 139 | individually chosen by them. 140 | 141 | m. Sui Generis Database Rights means rights other than copyright 142 | resulting from Directive 96/9/EC of the European Parliament and of 143 | the Council of 11 March 1996 on the legal protection of databases, 144 | as amended and/or succeeded, as well as other essentially 145 | equivalent rights anywhere in the world. 146 | 147 | n. You means the individual or entity exercising the Licensed Rights 148 | under this Public License. Your has a corresponding meaning. 149 | 150 | 151 | Section 2 -- Scope. 152 | 153 | a. License grant. 154 | 155 | 1. Subject to the terms and conditions of this Public License, 156 | the Licensor hereby grants You a worldwide, royalty-free, 157 | non-sublicensable, non-exclusive, irrevocable license to 158 | exercise the Licensed Rights in the Licensed Material to: 159 | 160 | a. reproduce and Share the Licensed Material, in whole or 161 | in part, for NonCommercial purposes only; and 162 | 163 | b. produce, reproduce, and Share Adapted Material for 164 | NonCommercial purposes only. 165 | 166 | 2. Exceptions and Limitations. For the avoidance of doubt, where 167 | Exceptions and Limitations apply to Your use, this Public 168 | License does not apply, and You do not need to comply with 169 | its terms and conditions. 170 | 171 | 3. Term. The term of this Public License is specified in Section 172 | 6(a). 173 | 174 | 4. Media and formats; technical modifications allowed. The 175 | Licensor authorizes You to exercise the Licensed Rights in 176 | all media and formats whether now known or hereafter created, 177 | and to make technical modifications necessary to do so. The 178 | Licensor waives and/or agrees not to assert any right or 179 | authority to forbid You from making technical modifications 180 | necessary to exercise the Licensed Rights, including 181 | technical modifications necessary to circumvent Effective 182 | Technological Measures. For purposes of this Public License, 183 | simply making modifications authorized by this Section 2(a) 184 | (4) never produces Adapted Material. 185 | 186 | 5. Downstream recipients. 187 | 188 | a. Offer from the Licensor -- Licensed Material. Every 189 | recipient of the Licensed Material automatically 190 | receives an offer from the Licensor to exercise the 191 | Licensed Rights under the terms and conditions of this 192 | Public License. 193 | 194 | b. Additional offer from the Licensor -- Adapted Material. 195 | Every recipient of Adapted Material from You 196 | automatically receives an offer from the Licensor to 197 | exercise the Licensed Rights in the Adapted Material 198 | under the conditions of the Adapter's License You apply. 199 | 200 | c. No downstream restrictions. You may not offer or impose 201 | any additional or different terms or conditions on, or 202 | apply any Effective Technological Measures to, the 203 | Licensed Material if doing so restricts exercise of the 204 | Licensed Rights by any recipient of the Licensed 205 | Material. 206 | 207 | 6. No endorsement. Nothing in this Public License constitutes or 208 | may be construed as permission to assert or imply that You 209 | are, or that Your use of the Licensed Material is, connected 210 | with, or sponsored, endorsed, or granted official status by, 211 | the Licensor or others designated to receive attribution as 212 | provided in Section 3(a)(1)(A)(i). 213 | 214 | b. Other rights. 215 | 216 | 1. Moral rights, such as the right of integrity, are not 217 | licensed under this Public License, nor are publicity, 218 | privacy, and/or other similar personality rights; however, to 219 | the extent possible, the Licensor waives and/or agrees not to 220 | assert any such rights held by the Licensor to the limited 221 | extent necessary to allow You to exercise the Licensed 222 | Rights, but not otherwise. 223 | 224 | 2. Patent and trademark rights are not licensed under this 225 | Public License. 226 | 227 | 3. To the extent possible, the Licensor waives any right to 228 | collect royalties from You for the exercise of the Licensed 229 | Rights, whether directly or through a collecting society 230 | under any voluntary or waivable statutory or compulsory 231 | licensing scheme. In all other cases the Licensor expressly 232 | reserves any right to collect such royalties, including when 233 | the Licensed Material is used other than for NonCommercial 234 | purposes. 235 | 236 | 237 | Section 3 -- License Conditions. 238 | 239 | Your exercise of the Licensed Rights is expressly made subject to the 240 | following conditions. 241 | 242 | a. Attribution. 243 | 244 | 1. If You Share the Licensed Material (including in modified 245 | form), You must: 246 | 247 | a. retain the following if it is supplied by the Licensor 248 | with the Licensed Material: 249 | 250 | i. identification of the creator(s) of the Licensed 251 | Material and any others designated to receive 252 | attribution, in any reasonable manner requested by 253 | the Licensor (including by pseudonym if 254 | designated); 255 | 256 | ii. a copyright notice; 257 | 258 | iii. a notice that refers to this Public License; 259 | 260 | iv. a notice that refers to the disclaimer of 261 | warranties; 262 | 263 | v. a URI or hyperlink to the Licensed Material to the 264 | extent reasonably practicable; 265 | 266 | b. indicate if You modified the Licensed Material and 267 | retain an indication of any previous modifications; and 268 | 269 | c. indicate the Licensed Material is licensed under this 270 | Public License, and include the text of, or the URI or 271 | hyperlink to, this Public License. 272 | 273 | 2. You may satisfy the conditions in Section 3(a)(1) in any 274 | reasonable manner based on the medium, means, and context in 275 | which You Share the Licensed Material. For example, it may be 276 | reasonable to satisfy the conditions by providing a URI or 277 | hyperlink to a resource that includes the required 278 | information. 279 | 3. If requested by the Licensor, You must remove any of the 280 | information required by Section 3(a)(1)(A) to the extent 281 | reasonably practicable. 282 | 283 | b. ShareAlike. 284 | 285 | In addition to the conditions in Section 3(a), if You Share 286 | Adapted Material You produce, the following conditions also apply. 287 | 288 | 1. The Adapter's License You apply must be a Creative Commons 289 | license with the same License Elements, this version or 290 | later, or a BY-NC-SA Compatible License. 291 | 292 | 2. You must include the text of, or the URI or hyperlink to, the 293 | Adapter's License You apply. You may satisfy this condition 294 | in any reasonable manner based on the medium, means, and 295 | context in which You Share Adapted Material. 296 | 297 | 3. You may not offer or impose any additional or different terms 298 | or conditions on, or apply any Effective Technological 299 | Measures to, Adapted Material that restrict exercise of the 300 | rights granted under the Adapter's License You apply. 301 | 302 | 303 | Section 4 -- Sui Generis Database Rights. 304 | 305 | Where the Licensed Rights include Sui Generis Database Rights that 306 | apply to Your use of the Licensed Material: 307 | 308 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 309 | to extract, reuse, reproduce, and Share all or a substantial 310 | portion of the contents of the database for NonCommercial purposes 311 | only; 312 | 313 | b. if You include all or a substantial portion of the database 314 | contents in a database in which You have Sui Generis Database 315 | Rights, then the database in which You have Sui Generis Database 316 | Rights (but not its individual contents) is Adapted Material, 317 | including for purposes of Section 3(b); and 318 | 319 | c. You must comply with the conditions in Section 3(a) if You Share 320 | all or a substantial portion of the contents of the database. 321 | 322 | For the avoidance of doubt, this Section 4 supplements and does not 323 | replace Your obligations under this Public License where the Licensed 324 | Rights include other Copyright and Similar Rights. 325 | 326 | 327 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 328 | 329 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 330 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 331 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 332 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 333 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 334 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 335 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 336 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 337 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 338 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 339 | 340 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 341 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 342 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 343 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 344 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 345 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 346 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 347 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 348 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 349 | 350 | c. The disclaimer of warranties and limitation of liability provided 351 | above shall be interpreted in a manner that, to the extent 352 | possible, most closely approximates an absolute disclaimer and 353 | waiver of all liability. 354 | 355 | 356 | Section 6 -- Term and Termination. 357 | 358 | a. This Public License applies for the term of the Copyright and 359 | Similar Rights licensed here. However, if You fail to comply with 360 | this Public License, then Your rights under this Public License 361 | terminate automatically. 362 | 363 | b. Where Your right to use the Licensed Material has terminated under 364 | Section 6(a), it reinstates: 365 | 366 | 1. automatically as of the date the violation is cured, provided 367 | it is cured within 30 days of Your discovery of the 368 | violation; or 369 | 370 | 2. upon express reinstatement by the Licensor. 371 | 372 | For the avoidance of doubt, this Section 6(b) does not affect any 373 | right the Licensor may have to seek remedies for Your violations 374 | of this Public License. 375 | 376 | c. For the avoidance of doubt, the Licensor may also offer the 377 | Licensed Material under separate terms or conditions or stop 378 | distributing the Licensed Material at any time; however, doing so 379 | will not terminate this Public License. 380 | 381 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 382 | License. 383 | 384 | 385 | Section 7 -- Other Terms and Conditions. 386 | 387 | a. The Licensor shall not be bound by any additional or different 388 | terms or conditions communicated by You unless expressly agreed. 389 | 390 | b. Any arrangements, understandings, or agreements regarding the 391 | Licensed Material not stated herein are separate from and 392 | independent of the terms and conditions of this Public License. 393 | 394 | 395 | Section 8 -- Interpretation. 396 | 397 | a. For the avoidance of doubt, this Public License does not, and 398 | shall not be interpreted to, reduce, limit, restrict, or impose 399 | conditions on any use of the Licensed Material that could lawfully 400 | be made without permission under this Public License. 401 | 402 | b. To the extent possible, if any provision of this Public License is 403 | deemed unenforceable, it shall be automatically reformed to the 404 | minimum extent necessary to make it enforceable. If the provision 405 | cannot be reformed, it shall be severed from this Public License 406 | without affecting the enforceability of the remaining terms and 407 | conditions. 408 | 409 | c. No term or condition of this Public License will be waived and no 410 | failure to comply consented to unless expressly agreed to by the 411 | Licensor. 412 | 413 | d. Nothing in this Public License constitutes or may be interpreted 414 | as a limitation upon, or waiver of, any privileges and immunities 415 | that apply to the Licensor or You, including from the legal 416 | processes of any jurisdiction or authority. 417 | 418 | ======================================================================= 419 | 420 | Creative Commons is not a party to its public 421 | licenses. Notwithstanding, Creative Commons may elect to apply one of 422 | its public licenses to material it publishes and in those instances 423 | will be considered the “Licensor.” The text of the Creative Commons 424 | public licenses is dedicated to the public domain under the CC0 Public 425 | Domain Dedication. Except for the limited purpose of indicating that 426 | material is shared under a Creative Commons public license or as 427 | otherwise permitted by the Creative Commons policies published at 428 | creativecommons.org/policies, Creative Commons does not authorize the 429 | use of the trademark "Creative Commons" or any other trademark or logo 430 | of Creative Commons without its prior written consent including, 431 | without limitation, in connection with any unauthorized modifications 432 | to any of its public licenses or any other arrangements, 433 | understandings, or agreements concerning use of licensed material. For 434 | the avoidance of doubt, this paragraph does not form part of the 435 | public licenses. 436 | 437 | Creative Commons may be contacted at creativecommons.org. 438 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | Logo of dvbfast 3 | 4 | # DVBfast 5 | Die schnellste Möglichkeit, Abfahrtsinformationen in Dresden zu erhalten. 6 | 7 | *The fastest way to get your departure infos in Dresden* 8 |
9 |

Webseite öffnen 10 |

11 |
12 |
13 | 14 | Disclaimer: Das Repo liegt bei lucasvog/dvbfast. Der Account dvbfast ist nur zum Hosten der Seite zuständig für die schönere Domain. Diese Software ist **keine** offizielle Anwendung der Dresdner Verkehrsbetriebe oder der VVO. Es werden lediglich die bereitgestellten öffentlichen Schnittstellen genutzt. 15 | 16 | ### Anleitung 17 | 1. dvbfast.github.io Aufrufen 18 | 2. Standorterkennung erlauben 19 | 3. Abfahrtsinformationen der nächsten Haltestellen einsehen! 20 | 4. Als WebApp installieren (optional, siehe unten) 21 | 22 | ### Installationsanleitung 23 | Die Webseite muss nach Plattform unterschiedlich installiert werden. 24 | #### A) iOS 25 | 1. Die Webseite in Safari Öffnen 26 | 2. Auf "Teilen" gehen 27 | 3. Nach unten scrollen, und "Zum Home-Bildschirm" auswählen 28 | 4. Mit "Hinzufügen" Bestätigen 29 | 30 | #### Android 31 | 1. Die Webseite in Chrome Öffnen 32 | 2. Menü aufrufen 33 | 3. "Zum Startbildschirm-Bildschirm hinzufügen" auswählen 34 | 4. Eventuell Hinzufügen Bestätigen 35 | Eventuell direkt auf den "Installieren"-Banner klicken falls dieser auftaucht (siehe Chrome Updates) 36 | 37 | ### FAQ 38 | *Ich werde aber nicht nach meinem Standort gefragt?* 39 | 1. Sicherstellen, dass der Browser die Standortberechtigungen besitzt 40 | 2. Sicherstellen, dass die Webseite auf iOS in Safari, und auf Android auf Chrome oder Firefox geöffnet wurde 41 | 42 | ### Verwendete Software: 43 | - https://github.com/tholman/github-corners unter MIT-Lizenz 44 | - https://materializecss.com/ unter MIT-Lizenz 45 | - https://material.io/resources/icons/ unter Apache 2.0 Lizenz 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /assets/css/style.css: -------------------------------------------------------------------------------- 1 | html,body,.container{ 2 | min-height: 100vh; 3 | } 4 | @font-face { 5 | font-family: 'Material Icons'; 6 | font-style: normal; 7 | font-weight: 400; 8 | src: local('Material Icons'), 9 | local('MaterialIcons-Regular'), 10 | url(../fonts/material-design-icons/font/MaterialIcons-Regular.ttf) format('truetype'); 11 | } 12 | .material-icons { 13 | font-family: 'Material Icons'; 14 | font-weight: normal; 15 | font-style: normal; 16 | font-size: 24px; /* Preferred icon size */ 17 | display: inline-block; 18 | line-height: 1; 19 | text-transform: none; 20 | letter-spacing: normal; 21 | word-wrap: normal; 22 | white-space: nowrap; 23 | direction: ltr; 24 | -webkit-font-smoothing: antialiased; 25 | text-rendering: optimizeLegibility; 26 | -moz-osx-font-smoothing: grayscale; 27 | font-feature-settings: 'liga'; 28 | } 29 | 30 | .material-icons-smaller { 31 | font-family: 'Material Icons'; 32 | font-weight: normal; 33 | font-style: normal; 34 | display: inline; 35 | line-height: 1; 36 | text-transform: none; 37 | letter-spacing: normal; 38 | word-wrap: normal; 39 | white-space: nowrap; 40 | direction: ltr; 41 | vertical-align: -15%; 42 | -webkit-font-smoothing: antialiased; 43 | text-rendering: optimizeLegibility; 44 | -moz-osx-font-smoothing: grayscale; 45 | font-feature-settings: 'liga'; 46 | } 47 | 48 | .halfspacing{ 49 | width: 100%; 50 | height: 1.5rem; 51 | } 52 | .spacing{ 53 | width: 100%; 54 | height: 3rem; 55 | } 56 | 57 | .stationTitle{ 58 | padding: 10px; 59 | padding-left:24px; 60 | padding-right:24px; 61 | border-radius:0 0 2px 2px 62 | } 63 | .noBottomMargin{ 64 | margin-bottom: 0px!important; 65 | } 66 | .verticalContainer{ 67 | position: relative; 68 | } 69 | .verticalMiddle{ 70 | margin: 0; 71 | position: absolute; 72 | top: 50%; 73 | transform: translate(0, -50%); 74 | } 75 | .noMargin{ 76 | margin:0px!important; 77 | } 78 | .fullWidth{ 79 | width: 100%; 80 | } 81 | 82 | .tripContainer{ 83 | margin:0px; 84 | padding: 3px; 85 | padding-top: 10px; 86 | padding-bottom: 10px; 87 | border-radius:0 0 2px 2px; 88 | overflow: auto; 89 | border-bottom: 1px solid rgba(0,0,0,0.1); 90 | min-height: 65px; 91 | } 92 | .noOverflow{ 93 | overflow: hidden; 94 | } 95 | .overflowHorizontalScroll{ 96 | overflow: hidden; 97 | /* overflow-x: scroll; */ 98 | } 99 | 100 | .tripIcon{ 101 | background-color: grey; 102 | 103 | } 104 | 105 | 106 | .tripDestination{ 107 | padding-left: 0.85rem!important; 108 | } 109 | .onTime{ 110 | color: rgb(54, 150, 23)!important; 111 | padding-right: 3px; 112 | } 113 | .desktopPadding{ 114 | height: 100%; 115 | padding-left: 15px; 116 | } 117 | .footerRow{ 118 | /* position: absolute; 119 | bottom:0px; */ 120 | width: 100%; 121 | font-size: 10px; 122 | text-align: center; 123 | } 124 | .footerRow a{ 125 | color: grey; 126 | } 127 | .delayed{ 128 | color:rgb(143, 1, 1); 129 | } 130 | .delayedText{ 131 | color: rgb(143, 1, 1); 132 | } 133 | .delayIcon{ 134 | margin-right: -7px; 135 | } 136 | 137 | .bus{ 138 | background-color: #005E79; 139 | color: white; 140 | overflow: hidden; 141 | border-radius: 20px; 142 | padding:2px; 143 | padding-left: 8px; 144 | padding-right: 8px; 145 | margin: 0px auto; 146 | } 147 | 148 | .faehre{ 149 | background-color: #00A5DF; 150 | color: white; 151 | overflow: hidden; 152 | border-radius: 20px; 153 | padding:2px; 154 | padding-left: 8px; 155 | padding-right: 8px; 156 | margin: 0px auto; 157 | } 158 | .sbahn{ 159 | background-color: #009551; 160 | color: white; 161 | overflow: hidden; 162 | border-radius: 20px; 163 | padding:2px; 164 | padding-left: 8px; 165 | padding-right: 8px; 166 | margin: 0px auto; 167 | 168 | 169 | } 170 | .schwebebahn{ 171 | background-color: #95C11F; 172 | color: white; 173 | padding:2px; 174 | padding-left: 3px; 175 | padding-right: 3px; 176 | font-size: 55%; 177 | } 178 | .strassenbahn{ 179 | background-color: #DD0B2F; 180 | color:white; 181 | padding:2px; 182 | padding-left: 8px; 183 | padding-right: 8px; 184 | } 185 | .zug{ 186 | background-color: #00A15E; 187 | color:white; 188 | overflow: hidden; 189 | border-radius: 5px; 190 | padding:2px; 191 | padding-left: 4px; 192 | padding-right: 4px; 193 | margin: 0px auto; 194 | font-size: 60%; 195 | } 196 | .taxi{ 197 | background-color: #FEC500; 198 | color:black; 199 | padding:2px; 200 | padding-left: 8px; 201 | padding-right: 8px; 202 | } 203 | .centerText{ 204 | text-align: center; 205 | } 206 | 207 | .cancelIcon{ 208 | margin-right: 3px; 209 | vertical-align: -5%; 210 | color:rgb(143, 1, 1); 211 | } 212 | 213 | .spinning{ 214 | -webkit-animation-name: spin; 215 | -webkit-animation-duration: 2000ms; 216 | -webkit-animation-iteration-count: infinite; 217 | -webkit-animation-timing-function: linear; 218 | -moz-animation-name: spin; 219 | -moz-animation-duration: 2000ms; 220 | -moz-animation-iteration-count: infinite; 221 | -moz-animation-timing-function: linear; 222 | -ms-animation-name: spin; 223 | -ms-animation-duration: 2000ms; 224 | -ms-animation-iteration-count: infinite; 225 | -ms-animation-timing-function: linear; 226 | 227 | animation-name: spin; 228 | animation-duration: 2000ms; 229 | animation-iteration-count: infinite; 230 | animation-timing-function: linear; 231 | } 232 | @-ms-keyframes spin { 233 | from { -ms-transform: rotate(0deg); } 234 | to { -ms-transform: rotate(360deg); } 235 | } 236 | @-moz-keyframes spin { 237 | from { -moz-transform: rotate(0deg); } 238 | to { -moz-transform: rotate(360deg); } 239 | } 240 | @-webkit-keyframes spin { 241 | from { -webkit-transform: rotate(0deg); } 242 | to { -webkit-transform: rotate(360deg); } 243 | } 244 | @keyframes spin { 245 | from { 246 | transform:rotate(0deg); 247 | } 248 | to { 249 | transform:rotate(360deg); 250 | } 251 | } 252 | 253 | .refreshButton{ 254 | padding-left: 5px!important; 255 | padding-right: 5px!important; 256 | -webkit-transition: background 1s ease-out; 257 | -moz-transition: background 1s ease-out; 258 | -o-transition: background 1s ease-out; 259 | transition: background 1s ease-out; 260 | } 261 | .dsgvo{ 262 | word-wrap: break-word; /* IE 5.5-7 */ 263 | white-space: -moz-pre-wrap; /* Firefox 1.0-2.0 */ 264 | white-space: pre-wrap; /* current browsers */ 265 | } 266 | .dsgvo p{ 267 | margin:0px!important; 268 | } 269 | .switch label input[type="checkbox"]:checked + .lever::after{ 270 | 271 | background-color: #f57c00!important; 272 | } 273 | .switch label input[type="checkbox"]:checked + .lever{ 274 | background-color: #ffa000!important; 275 | } 276 | summary{ 277 | margin: 7px; 278 | padding:12px; 279 | } 280 | .fixedMenu{ 281 | position: fixed; 282 | top: 0px; 283 | z-index: 990; 284 | } 285 | .invisible{ 286 | opacity: 0; 287 | } 288 | .forkBanner{ 289 | position: absolute; 290 | right:0px; 291 | } 292 | 293 | #refreshSpinner{ 294 | margin-right: 5px!important; 295 | } 296 | .sidenav-trigger{ 297 | display: block!important; 298 | } 299 | 300 | .github-corner:hover .octo-arm { 301 | animation: octocat-wave 560ms ease-in-out 302 | } 303 | 304 | .autocomplete-content.dropdown-content li span{ 305 | color:black; 306 | } 307 | .autocomplete-content.dropdown-content li span.highlight{ 308 | color:#ff8f00; 309 | } 310 | .material-icons.prefix.active{ 311 | color:#ff8f00!important; 312 | } 313 | .input:not([type]):focus:not([readonly]), input[type="text"]:not(.browser-default):focus:not([readonly]), input[type="password"]:not(.browser-default):focus:not([readonly]), input[type="email"]:not(.browser-default):focus:not([readonly]), input[type="url"]:not(.browser-default):focus:not([readonly]), input[type="time"]:not(.browser-default):focus:not([readonly]), input[type="date"]:not(.browser-default):focus:not([readonly]), input[type="datetime"]:not(.browser-default):focus:not([readonly]), input[type="datetime-local"]:not(.browser-default):focus:not([readonly]), input[type="tel"]:not(.browser-default):focus:not([readonly]), input[type="number"]:not(.browser-default):focus:not([readonly]), input[type="search"]:not(.browser-default):focus:not([readonly]), textarea.materialize-textarea:focus:not([readonly]){ 314 | border-bottom:1px solid #ff8f00!important; 315 | box-shadow: 0 1px 0 0 #ff8f00!important; 316 | } 317 | 318 | @keyframes octocat-wave { 319 | 320 | 0%, 321 | 100% { 322 | transform: rotate(0) 323 | } 324 | 325 | 20%, 326 | 60% { 327 | transform: rotate(-25deg) 328 | } 329 | 330 | 40%, 331 | 80% { 332 | transform: rotate(10deg) 333 | } 334 | } 335 | 336 | @media (max-width:500px) { 337 | .github-corner:hover .octo-arm { 338 | animation: none 339 | } 340 | 341 | .github-corner .octo-arm { 342 | animation: octocat-wave 560ms ease-in-out 343 | } 344 | } 345 | 346 | 347 | .searchResultContainer{ 348 | position: relative; 349 | 350 | } 351 | .searchCloseButton{ 352 | position: absolute; 353 | top:0px; 354 | right:7px; 355 | color:black; 356 | 357 | } 358 | .searchCloseButton i{ 359 | color: black!important; 360 | font-size: 200%; 361 | margin-top: 15px; 362 | margin-right: 10px; 363 | } 364 | .searchCloseButton i:hover{ 365 | color: #ff8f00!important; 366 | } 367 | .searchResultContainer{ 368 | background-color: #e8e8e8!important; 369 | } 370 | .hidden { 371 | display: none; 372 | } 373 | .searchResultContainer .card-action{ 374 | border-bottom: 2px solid rgba(0,0,0,0.06); 375 | } 376 | .searchResultContainer .card-action .title{ 377 | display: inline-block; 378 | } 379 | 380 | 381 | .searchBar{ 382 | padding-right:1.5rem!important; 383 | box-sizing: border-box!important; 384 | 385 | } 386 | .searchContainer{ 387 | position: relative!important; 388 | } 389 | .clearSearchIcon{ 390 | position: absolute; 391 | padding-right:0.75rem; 392 | right:0px; 393 | top:0px; 394 | line-height: 3rem; 395 | color:black; 396 | cursor: pointer; 397 | } 398 | .showMoreDeparturesContainer{ 399 | text-align: center; 400 | line-height: 40px; 401 | cursor: pointer; 402 | } 403 | .showMoreDeparturesContainer:hover{ 404 | background-color: rgba(0,0,0,0.1); 405 | } 406 | 407 | .showMoreDepartures{ 408 | cursor: pointer; 409 | } 410 | 411 | 412 | 413 | /* Dark Mode */ 414 | 415 | @media (prefers-color-scheme: dark) { 416 | body{ 417 | background-color: #212121; 418 | } 419 | .octo-body{ 420 | fill: #212121; 421 | } 422 | .octo-arm{ 423 | fill: #212121; 424 | } 425 | .tripContainer{ 426 | background-color: #424242; 427 | color:white; 428 | } 429 | .delayed{ 430 | color:rgb(232, 62, 62); 431 | } 432 | .delayedText{ 433 | color:rgb(232, 62, 62); 434 | } 435 | .cancelIcon{ 436 | color:rgb(232, 62, 62); 437 | } 438 | #boxcontainer > div > .card{ 439 | background-color: #424242; 440 | } 441 | .sidenav{ 442 | background-color: #424242!important; 443 | color:white!important; 444 | } 445 | .sidenav li a,.sidenav li a i.material-icons{ 446 | color:white!important; 447 | text-decoration: none; 448 | } 449 | .sidenav li::marker{ 450 | color:rgba(0,0,0,0)!important; 451 | } 452 | .modal,.modal-footer{ 453 | background-color: #424242!important; 454 | color:white!important; 455 | } 456 | .modal-footer a{ 457 | color:white!important; 458 | } 459 | .dsgvo{ 460 | color:white; 461 | } 462 | .autocomplete-content.dropdown-content{ 463 | background-color:#424242; 464 | } 465 | .autocomplete-content.dropdown-content li:hover{ 466 | background-color:#555555; 467 | } 468 | .autocomplete-content.dropdown-content li span{ 469 | color:white; 470 | } 471 | .autocomplete-content.dropdown-content li span.highlight{ 472 | color:#ff8f00; 473 | } 474 | #autocomplete-input{ 475 | color:white!important; 476 | } 477 | .material-icons.prefix{ 478 | color:white!important; 479 | } 480 | .searchResultContainer{ 481 | background-color: #323232!important; 482 | } 483 | .searchResultContainer .card-action .title{ 484 | color:white; 485 | } 486 | .searchResultCard{ 487 | background-color:#555555!important ; 488 | } 489 | .clearSearchIcon{ 490 | color:white; 491 | } 492 | .showMoreDepartures{ 493 | color:white; 494 | } 495 | .showMoreDeparturesContainer:hover{ 496 | background-color: rgba(255,255,255,0.1)!important; 497 | } 498 | } 499 | -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/README.md: -------------------------------------------------------------------------------- 1 | ## Material design icons 2 | 3 | Material design icons is the official [icon set](https://www.google.com/design/spec/style/icons.html#icons-system-icons) from Google. The icons are designed under the [material design guidelines](https://material.io/guidelines/). 4 | 5 | ### 4.0.0 Update 6 | 7 | Restructured repository, updated assets. 8 | 9 | ### 3.0.1 Update 10 | 11 | * Changed license in package.json. 12 | * Added missing device symbol sprites. 13 | 14 | ### 3.0.0 Update 15 | 16 | License change to Apache 2.0! 17 | 18 | ## Getting Started 19 | 20 | Read the [developer guide](https://google.github.io/material-design-icons/) on how to use the material design icons in your project. 21 | 22 | ### Using a font 23 | 24 | The `font` folder contains pre-generated font files that can be included in a project. This is especially convenient for the web; however, it is generally better to link to the web font hosted on Google Fonts: 25 | 26 | ```html 27 | 29 | ``` 30 | 31 | Read more in the [font portion](https://google.github.io/material-design-icons/#icon-font-for-the-web) of our full developer guide. 32 | 33 | 34 | ## License 35 | 36 | We have made these icons available for you to incorporate into your products under the [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt). Feel free to remix and re-share these icons and documentation in your products. 37 | We'd love attribution in your app's *about* screen, but it's not required. The only thing we ask is that you not re-sell these icons. 38 | -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/MaterialIcons-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/fonts/material-design-icons/font/MaterialIcons-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/MaterialIconsOutlined-Regular.codepoints: -------------------------------------------------------------------------------- 1 | 360 e577 2 | 3d_rotation e84d 3 | 4k e072 4 | 5g ef38 5 | 6_ft_apart f21e 6 | ac_unit eb3b 7 | access_alarm e190 8 | access_alarms e191 9 | access_time e192 10 | accessibility e84e 11 | accessibility_new e92c 12 | accessible e914 13 | accessible_forward e934 14 | account_balance e84f 15 | account_balance_wallet e850 16 | account_box e851 17 | account_circle e853 18 | account_tree e97a 19 | ad_units ef39 20 | adb e60e 21 | add e145 22 | add_a_photo e439 23 | add_alarm e193 24 | add_alert e003 25 | add_box e146 26 | add_business e729 27 | add_circle e147 28 | add_circle_outline e148 29 | add_comment e266 30 | add_ic_call e97c 31 | add_location e567 32 | add_location_alt ef3a 33 | add_photo_alternate e43e 34 | add_road ef3b 35 | add_shopping_cart e854 36 | add_task f23a 37 | add_to_home_screen e1fe 38 | add_to_photos e39d 39 | add_to_queue e05c 40 | addchart ef3c 41 | adjust e39e 42 | admin_panel_settings ef3d 43 | agriculture ea79 44 | airline_seat_flat e630 45 | airline_seat_flat_angled e631 46 | airline_seat_individual_suite e632 47 | airline_seat_legroom_extra e633 48 | airline_seat_legroom_normal e634 49 | airline_seat_legroom_reduced e635 50 | airline_seat_recline_extra e636 51 | airline_seat_recline_normal e637 52 | airplanemode_active e195 53 | airplanemode_inactive e194 54 | airplanemode_off e194 55 | airplanemode_on e195 56 | airplay e055 57 | airport_shuttle eb3c 58 | alarm e855 59 | alarm_add e856 60 | alarm_off e857 61 | alarm_on e858 62 | album e019 63 | align_horizontal_center e00f 64 | align_horizontal_left e00d 65 | align_horizontal_right e010 66 | align_vertical_bottom e015 67 | align_vertical_center e011 68 | align_vertical_top e00c 69 | all_inbox e97f 70 | all_inclusive eb3d 71 | all_out e90b 72 | alt_route f184 73 | alternate_email e0e6 74 | amp_stories ea13 75 | analytics ef3e 76 | anchor f1cd 77 | android e859 78 | announcement e85a 79 | apartment ea40 80 | api f1b7 81 | app_blocking ef3f 82 | app_settings_alt ef41 83 | apps e5c3 84 | architecture ea3b 85 | archive e149 86 | arrow_back e5c4 87 | arrow_back_ios e5e0 88 | arrow_circle_down f181 89 | arrow_circle_up f182 90 | arrow_downward e5db 91 | arrow_drop_down e5c5 92 | arrow_drop_down_circle e5c6 93 | arrow_drop_up e5c7 94 | arrow_forward e5c8 95 | arrow_forward_ios e5e1 96 | arrow_left e5de 97 | arrow_right e5df 98 | arrow_right_alt e941 99 | arrow_upward e5d8 100 | art_track e060 101 | article ef42 102 | aspect_ratio e85b 103 | assessment e85c 104 | assignment e85d 105 | assignment_ind e85e 106 | assignment_late e85f 107 | assignment_return e860 108 | assignment_returned e861 109 | assignment_turned_in e862 110 | assistant e39f 111 | assistant_photo e3a0 112 | atm e573 113 | attach_email ea5e 114 | attach_file e226 115 | attach_money e227 116 | attachment e2bc 117 | attribution efdb 118 | audiotrack e3a1 119 | auto_delete ea4c 120 | autorenew e863 121 | av_timer e01b 122 | baby_changing_station f19b 123 | backpack f19c 124 | backspace e14a 125 | backup e864 126 | backup_table ef43 127 | ballot e172 128 | bar_chart e26b 129 | batch_prediction f0f5 130 | bathtub ea41 131 | battery_alert e19c 132 | battery_charging_full e1a3 133 | battery_full e1a4 134 | battery_std e1a5 135 | battery_unknown e1a6 136 | beach_access eb3e 137 | bedtime ef44 138 | beenhere e52d 139 | bento f1f4 140 | bike_scooter ef45 141 | biotech ea3a 142 | block e14b 143 | bluetooth e1a7 144 | bluetooth_audio e60f 145 | bluetooth_connected e1a8 146 | bluetooth_disabled e1a9 147 | bluetooth_searching e1aa 148 | blur_circular e3a2 149 | blur_linear e3a3 150 | blur_off e3a4 151 | blur_on e3a5 152 | book e865 153 | book_online f217 154 | bookmark e866 155 | bookmark_border e867 156 | bookmark_outline e867 157 | bookmarks e98b 158 | border_all e228 159 | border_bottom e229 160 | border_clear e22a 161 | border_horizontal e22c 162 | border_inner e22d 163 | border_left e22e 164 | border_outer e22f 165 | border_right e230 166 | border_style e231 167 | border_top e232 168 | border_vertical e233 169 | branding_watermark e06b 170 | brightness_1 e3a6 171 | brightness_2 e3a7 172 | brightness_3 e3a8 173 | brightness_4 e3a9 174 | brightness_5 e3aa 175 | brightness_6 e3ab 176 | brightness_7 e3ac 177 | brightness_auto e1ab 178 | brightness_high e1ac 179 | brightness_low e1ad 180 | brightness_medium e1ae 181 | broken_image e3ad 182 | browser_not_supported ef47 183 | brush e3ae 184 | bubble_chart e6dd 185 | bug_report e868 186 | build e869 187 | build_circle ef48 188 | burst_mode e43c 189 | business e0af 190 | business_center eb3f 191 | cached e86a 192 | cake e7e9 193 | calculate ea5f 194 | calendar_today e935 195 | calendar_view_day e936 196 | call e0b0 197 | call_end e0b1 198 | call_made e0b2 199 | call_merge e0b3 200 | call_missed e0b4 201 | call_missed_outgoing e0e4 202 | call_received e0b5 203 | call_split e0b6 204 | call_to_action e06c 205 | camera e3af 206 | camera_alt e3b0 207 | camera_enhance e8fc 208 | camera_front e3b1 209 | camera_rear e3b2 210 | camera_roll e3b3 211 | campaign ef49 212 | cancel e5c9 213 | cancel_presentation e0e9 214 | cancel_schedule_send ea39 215 | card_giftcard e8f6 216 | card_membership e8f7 217 | card_travel e8f8 218 | carpenter f1f8 219 | casino eb40 220 | cast e307 221 | cast_connected e308 222 | cast_for_education efec 223 | category e574 224 | center_focus_strong e3b4 225 | center_focus_weak e3b5 226 | change_history e86b 227 | charging_station f19d 228 | chat e0b7 229 | chat_bubble e0ca 230 | chat_bubble_outline e0cb 231 | check e5ca 232 | check_box e834 233 | check_box_outline_blank e835 234 | check_circle e86c 235 | check_circle_outline e92d 236 | checkroom f19e 237 | chevron_left e5cb 238 | chevron_right e5cc 239 | child_care eb41 240 | child_friendly eb42 241 | chrome_reader_mode e86d 242 | class e86e 243 | clean_hands f21f 244 | cleaning_services f0ff 245 | clear e14c 246 | clear_all e0b8 247 | close e5cd 248 | close_fullscreen f1cf 249 | closed_caption e01c 250 | closed_caption_disabled f1dc 251 | cloud e2bd 252 | cloud_circle e2be 253 | cloud_done e2bf 254 | cloud_download e2c0 255 | cloud_off e2c1 256 | cloud_queue e2c2 257 | cloud_upload e2c3 258 | code e86f 259 | collections e3b6 260 | collections_bookmark e431 261 | color_lens e3b7 262 | colorize e3b8 263 | comment e0b9 264 | comment_bank ea4e 265 | commute e940 266 | compare e3b9 267 | compare_arrows e915 268 | compass_calibration e57c 269 | computer e30a 270 | confirmation_num e638 271 | confirmation_number e638 272 | connect_without_contact f223 273 | construction ea3c 274 | contact_mail e0d0 275 | contact_page f22e 276 | contact_phone e0cf 277 | contact_support e94c 278 | contactless ea71 279 | contacts e0ba 280 | content_copy f08a 281 | content_cut f08b 282 | content_paste f098 283 | control_camera e074 284 | control_point e3ba 285 | control_point_duplicate e3bb 286 | copy f08a 287 | copyright e90c 288 | coronavirus f221 289 | corporate_fare f1d0 290 | countertops f1f7 291 | create e150 292 | create_new_folder e2cc 293 | credit_card e870 294 | crop e3be 295 | crop_16_9 e3bc 296 | crop_3_2 e3bd 297 | crop_5_4 e3bf 298 | crop_7_5 e3c0 299 | crop_din e3c1 300 | crop_free e3c2 301 | crop_landscape e3c3 302 | crop_original e3c4 303 | crop_portrait e3c5 304 | crop_rotate e437 305 | crop_square e3c6 306 | cut f08b 307 | dashboard e871 308 | data_usage e1af 309 | date_range e916 310 | deck ea42 311 | dehaze e3c7 312 | delete e872 313 | delete_forever e92b 314 | delete_outline e92e 315 | delete_sweep e16c 316 | departure_board e576 317 | description e873 318 | design_services f10a 319 | desktop_access_disabled e99d 320 | desktop_mac e30b 321 | desktop_windows e30c 322 | details e3c8 323 | developer_board e30d 324 | developer_mode e1b0 325 | device_hub e335 326 | device_unknown e339 327 | devices e1b1 328 | devices_other e337 329 | dialer_sip e0bb 330 | dialpad e0bc 331 | directions e52e 332 | directions_bike e52f 333 | directions_boat e532 334 | directions_bus e530 335 | directions_car e531 336 | directions_ferry e532 337 | directions_off f10f 338 | directions_railway e534 339 | directions_run e566 340 | directions_subway e533 341 | directions_train e534 342 | directions_transit e535 343 | directions_walk e536 344 | disabled_by_default f230 345 | disc_full e610 346 | dns e875 347 | do_disturb f08c 348 | do_disturb_alt f08d 349 | do_disturb_off f08e 350 | do_disturb_on f08f 351 | do_not_step f19f 352 | do_not_touch f1b0 353 | dock e30e 354 | domain e7ee 355 | domain_disabled e0ef 356 | domain_verification ef4c 357 | done e876 358 | done_all e877 359 | done_outline e92f 360 | donut_large e917 361 | donut_small e918 362 | double_arrow ea50 363 | download f090 364 | download_done f091 365 | drafts e151 366 | drag_handle e25d 367 | drag_indicator e945 368 | drive_eta e613 369 | dry f1b3 370 | duo e9a5 371 | dvr e1b2 372 | dynamic_feed ea14 373 | dynamic_form f1bf 374 | east f1df 375 | eco ea35 376 | edit e3c9 377 | edit_attributes e578 378 | edit_location e568 379 | edit_road ef4d 380 | eject e8fb 381 | elderly f21a 382 | electric_bike eb1b 383 | electric_car eb1c 384 | electric_moped eb1d 385 | electric_scooter eb1f 386 | electrical_services f102 387 | elevator f1a0 388 | email e0be 389 | emoji_emotions ea22 390 | emoji_events ea23 391 | emoji_flags ea1a 392 | emoji_food_beverage ea1b 393 | emoji_nature ea1c 394 | emoji_objects ea24 395 | emoji_people ea1d 396 | emoji_symbols ea1e 397 | emoji_transportation ea1f 398 | engineering ea3d 399 | enhance_photo_translate e8fc 400 | enhanced_encryption e63f 401 | equalizer e01d 402 | error e000 403 | error_outline e001 404 | escalator f1a1 405 | escalator_warning f1ac 406 | euro ea15 407 | euro_symbol e926 408 | ev_station e56d 409 | event e878 410 | event_available e614 411 | event_busy e615 412 | event_note e616 413 | event_seat e903 414 | exit_to_app e879 415 | expand_less e5ce 416 | expand_more e5cf 417 | explicit e01e 418 | explore e87a 419 | explore_off e9a8 420 | exposure e3ca 421 | exposure_minus_1 e3cb 422 | exposure_minus_2 e3cc 423 | exposure_neg_1 e3cb 424 | exposure_neg_2 e3cc 425 | exposure_plus_1 e3cd 426 | exposure_plus_2 e3ce 427 | exposure_zero e3cf 428 | extension e87b 429 | face e87c 430 | face_unlock f008 431 | facebook f234 432 | fact_check f0c5 433 | family_restroom f1a2 434 | fast_forward e01f 435 | fast_rewind e020 436 | fastfood e57a 437 | favorite e87d 438 | favorite_border e87e 439 | favorite_outline e87e 440 | featured_play_list e06d 441 | featured_video e06e 442 | feedback e87f 443 | fence f1f6 444 | fiber_dvr e05d 445 | fiber_manual_record e061 446 | fiber_new e05e 447 | fiber_pin e06a 448 | fiber_smart_record e062 449 | file_copy e173 450 | filter e3d3 451 | filter_1 e3d0 452 | filter_2 e3d1 453 | filter_3 e3d2 454 | filter_4 e3d4 455 | filter_5 e3d5 456 | filter_6 e3d6 457 | filter_7 e3d7 458 | filter_8 e3d8 459 | filter_9 e3d9 460 | filter_9_plus e3da 461 | filter_alt ef4f 462 | filter_b_and_w e3db 463 | filter_center_focus e3dc 464 | filter_drama e3dd 465 | filter_frames e3de 466 | filter_hdr e3df 467 | filter_list e152 468 | filter_none e3e0 469 | filter_tilt_shift e3e2 470 | filter_vintage e3e3 471 | find_in_page e880 472 | find_replace e881 473 | fingerprint e90d 474 | fire_extinguisher f1d8 475 | fireplace ea43 476 | first_page e5dc 477 | fitness_center eb43 478 | flag e153 479 | flaky ef50 480 | flare e3e4 481 | flash_auto e3e5 482 | flash_off e3e6 483 | flash_on e3e7 484 | flight e539 485 | flight_land e904 486 | flight_takeoff e905 487 | flip e3e8 488 | flip_camera_android ea37 489 | flip_camera_ios ea38 490 | flip_to_back e882 491 | flip_to_front e883 492 | folder e2c7 493 | folder_open e2c8 494 | folder_shared e2c9 495 | folder_special e617 496 | follow_the_signs f222 497 | font_download e167 498 | food_bank f1f2 499 | format_align_center e234 500 | format_align_justify e235 501 | format_align_left e236 502 | format_align_right e237 503 | format_bold e238 504 | format_clear e239 505 | format_color_reset e23b 506 | format_indent_decrease e23d 507 | format_indent_increase e23e 508 | format_italic e23f 509 | format_line_spacing e240 510 | format_list_bulleted e241 511 | format_list_numbered e242 512 | format_list_numbered_rtl e267 513 | format_paint e243 514 | format_quote e244 515 | format_shapes e25e 516 | format_size e245 517 | format_strikethrough e246 518 | format_textdirection_l_to_r e247 519 | format_textdirection_r_to_l e248 520 | format_underline e249 521 | format_underlined e249 522 | forum e0bf 523 | forward e154 524 | forward_10 e056 525 | forward_30 e057 526 | forward_5 e058 527 | forward_to_inbox f187 528 | foundation f200 529 | free_breakfast eb44 530 | fullscreen e5d0 531 | fullscreen_exit e5d1 532 | functions e24a 533 | g_translate e927 534 | gamepad e30f 535 | games e021 536 | gavel e90e 537 | gesture e155 538 | get_app e884 539 | gif e908 540 | golf_course eb45 541 | gps_fixed e1b3 542 | gps_not_fixed e1b4 543 | gps_off e1b5 544 | grade e885 545 | gradient e3e9 546 | grading ea4f 547 | grain e3ea 548 | graphic_eq e1b8 549 | grass f205 550 | grid_off e3eb 551 | grid_on e3ec 552 | group e7ef 553 | group_add e7f0 554 | group_work e886 555 | groups f233 556 | handyman f10b 557 | hd e052 558 | hdr_off e3ed 559 | hdr_on e3ee 560 | hdr_strong e3f1 561 | hdr_weak e3f2 562 | headset e310 563 | headset_mic e311 564 | healing e3f3 565 | hearing e023 566 | hearing_disabled f104 567 | height ea16 568 | help e887 569 | help_center f1c0 570 | help_outline e8fd 571 | high_quality e024 572 | highlight e25f 573 | highlight_alt ef52 574 | highlight_off e888 575 | highlight_remove e888 576 | history e889 577 | history_edu ea3e 578 | history_toggle_off f17d 579 | home e88a 580 | home_repair_service f100 581 | home_work ea09 582 | horizontal_distribute e014 583 | horizontal_rule f108 584 | horizontal_split e947 585 | hot_tub eb46 586 | hotel e53a 587 | hourglass_bottom ea5c 588 | hourglass_disabled ef53 589 | hourglass_empty e88b 590 | hourglass_full e88c 591 | hourglass_top ea5b 592 | house ea44 593 | house_siding f202 594 | how_to_reg e174 595 | how_to_vote e175 596 | http e902 597 | https e88d 598 | hvac f10e 599 | image e3f4 600 | image_aspect_ratio e3f5 601 | image_not_supported f116 602 | image_search e43f 603 | import_contacts e0e0 604 | import_export e0c3 605 | important_devices e912 606 | inbox e156 607 | indeterminate_check_box e909 608 | info e88e 609 | input e890 610 | insert_chart e24b 611 | insert_chart_outlined e26a 612 | insert_comment e24c 613 | insert_drive_file e24d 614 | insert_emoticon e24e 615 | insert_invitation e24f 616 | insert_link e250 617 | insert_photo e251 618 | insights f092 619 | integration_instructions ef54 620 | invert_colors e891 621 | invert_colors_off e0c4 622 | invert_colors_on e891 623 | iso e3f6 624 | keyboard e312 625 | keyboard_arrow_down e313 626 | keyboard_arrow_left e314 627 | keyboard_arrow_right e315 628 | keyboard_arrow_up e316 629 | keyboard_backspace e317 630 | keyboard_capslock e318 631 | keyboard_control e5d3 632 | keyboard_hide e31a 633 | keyboard_return e31b 634 | keyboard_tab e31c 635 | keyboard_voice e31d 636 | king_bed ea45 637 | kitchen eb47 638 | label e892 639 | label_important e937 640 | label_off e9b6 641 | landscape e3f7 642 | language e894 643 | laptop e31e 644 | laptop_chromebook e31f 645 | laptop_mac e320 646 | laptop_windows e321 647 | last_page e5dd 648 | launch e895 649 | layers e53b 650 | layers_clear e53c 651 | leaderboard f20c 652 | leak_add e3f8 653 | leak_remove e3f9 654 | leave_bags_at_home f23b 655 | legend_toggle f11b 656 | lens e3fa 657 | library_add e02e 658 | library_add_check e9b7 659 | library_books e02f 660 | library_music e030 661 | lightbulb e0f0 662 | line_style e919 663 | line_weight e91a 664 | linear_scale e260 665 | link e157 666 | link_off e16f 667 | linked_camera e438 668 | list e896 669 | list_alt e0ee 670 | live_help e0c6 671 | live_tv e639 672 | local_activity e53f 673 | local_airport e53d 674 | local_atm e53e 675 | local_attraction e53f 676 | local_bar e540 677 | local_cafe e541 678 | local_car_wash e542 679 | local_convenience_store e543 680 | local_dining e556 681 | local_drink e544 682 | local_fire_department ef55 683 | local_florist e545 684 | local_gas_station e546 685 | local_grocery_store e547 686 | local_hospital e548 687 | local_hotel e549 688 | local_laundry_service e54a 689 | local_library e54b 690 | local_mall e54c 691 | local_movies e54d 692 | local_offer e54e 693 | local_parking e54f 694 | local_pharmacy e550 695 | local_phone e551 696 | local_pizza e552 697 | local_play e553 698 | local_police ef56 699 | local_post_office e554 700 | local_print_shop e555 701 | local_printshop e555 702 | local_restaurant e556 703 | local_see e557 704 | local_shipping e558 705 | local_taxi e559 706 | location_city e7f1 707 | location_disabled e1b6 708 | location_history e55a 709 | location_off e0c7 710 | location_on e0c8 711 | location_searching e1b7 712 | lock e897 713 | lock_open e898 714 | login ea77 715 | looks e3fc 716 | looks_3 e3fb 717 | looks_4 e3fd 718 | looks_5 e3fe 719 | looks_6 e3ff 720 | looks_one e400 721 | looks_two e401 722 | loop e028 723 | loupe e402 724 | low_priority e16d 725 | loyalty e89a 726 | luggage f235 727 | mail e158 728 | mail_outline e0e1 729 | map e55b 730 | maps_ugc ef58 731 | mark_chat_read f18b 732 | mark_chat_unread f189 733 | mark_email_read f18c 734 | mark_email_unread f18a 735 | markunread e159 736 | markunread_mailbox e89b 737 | masks f218 738 | maximize e930 739 | mediation efa7 740 | medical_services f109 741 | meeting_room eb4f 742 | memory e322 743 | menu e5d2 744 | menu_book ea19 745 | menu_open e9bd 746 | merge_type e252 747 | message e0c9 748 | messenger e0ca 749 | messenger_outline e0cb 750 | mic e029 751 | mic_none e02a 752 | mic_off e02b 753 | microwave f204 754 | military_tech ea3f 755 | minimize e931 756 | miscellaneous_services f10c 757 | missed_video_call e073 758 | mms e618 759 | mobile_friendly e200 760 | mobile_off e201 761 | mobile_screen_share e0e7 762 | mode f097 763 | mode_comment e253 764 | model_training f0cf 765 | monetization_on e263 766 | money e57d 767 | money_off e25c 768 | money_off_csred f038 769 | monochrome_photos e403 770 | mood e7f2 771 | mood_bad e7f3 772 | moped eb28 773 | more e619 774 | more_horiz e5d3 775 | more_time ea5d 776 | more_vert e5d4 777 | motion_photos_on e9c1 778 | motion_photos_pause f227 779 | motion_photos_paused e9c2 780 | motorcycle e91b 781 | mouse e323 782 | move_to_inbox e168 783 | movie e02c 784 | movie_creation e404 785 | movie_filter e43a 786 | multiline_chart e6df 787 | multiple_stop f1b9 788 | multitrack_audio e1b8 789 | museum ea36 790 | music_note e405 791 | music_off e440 792 | music_video e063 793 | my_library_add e02e 794 | my_library_books e02f 795 | my_library_music e030 796 | my_location e55c 797 | nat ef5c 798 | nature e406 799 | nature_people e407 800 | navigate_before e408 801 | navigate_next e409 802 | navigation e55d 803 | near_me e569 804 | near_me_disabled f1ef 805 | network_check e640 806 | network_locked e61a 807 | new_releases e031 808 | next_plan ef5d 809 | next_week e16a 810 | nfc e1bb 811 | night_shelter f1f1 812 | nights_stay ea46 813 | no_backpack f237 814 | no_cell f1a4 815 | no_drinks f1a5 816 | no_encryption e641 817 | no_encryption_gmailerrorred f03f 818 | no_flash f1a6 819 | no_food f1a7 820 | no_luggage f23b 821 | no_meals f1d6 822 | no_meeting_room eb4e 823 | no_photography f1a8 824 | no_sim e0cc 825 | no_stroller f1af 826 | no_transfer f1d5 827 | north f1e0 828 | north_east f1e1 829 | north_west f1e2 830 | not_accessible f0fe 831 | not_interested e033 832 | not_listed_location e575 833 | not_started f0d1 834 | note e06f 835 | note_add e89c 836 | notes e26c 837 | notification_important e004 838 | notifications e7f4 839 | notifications_active e7f7 840 | notifications_none e7f5 841 | notifications_off e7f6 842 | notifications_on e7f7 843 | notifications_paused e7f8 844 | now_wallpaper e1bc 845 | now_widgets e1bd 846 | offline_bolt e932 847 | offline_pin e90a 848 | ondemand_video e63a 849 | online_prediction f0eb 850 | opacity e91c 851 | open_in_browser e89d 852 | open_in_full f1ce 853 | open_in_new e89e 854 | open_with e89f 855 | outbond f228 856 | outdoor_grill ea47 857 | outlet f1d4 858 | outlined_flag e16e 859 | pages e7f9 860 | pageview e8a0 861 | palette e40a 862 | pan_tool e925 863 | panorama e40b 864 | panorama_fish_eye e40c 865 | panorama_fisheye e40c 866 | panorama_horizontal e40d 867 | panorama_vertical e40e 868 | panorama_wide_angle e40f 869 | party_mode e7fa 870 | paste f098 871 | pause e034 872 | pause_circle_filled e035 873 | pause_circle_outline e036 874 | pause_presentation e0ea 875 | payment e8a1 876 | payments ef63 877 | pedal_bike eb29 878 | pending ef64 879 | pending_actions f1bb 880 | people e7fb 881 | people_alt ea21 882 | people_outline e7fc 883 | perm_camera_mic e8a2 884 | perm_contact_cal e8a3 885 | perm_contact_calendar e8a3 886 | perm_data_setting e8a4 887 | perm_device_info e8a5 888 | perm_device_information e8a5 889 | perm_identity e8a6 890 | perm_media e8a7 891 | perm_phone_msg e8a8 892 | perm_scan_wifi e8a9 893 | person e7fd 894 | person_add e7fe 895 | person_add_alt_1 ef65 896 | person_add_disabled e9cb 897 | person_outline e7ff 898 | person_pin e55a 899 | person_pin_circle e56a 900 | person_remove ef66 901 | person_remove_alt_1 ef67 902 | person_search f106 903 | personal_video e63b 904 | pest_control f0fa 905 | pest_control_rodent f0fd 906 | pets e91d 907 | phone e0cd 908 | phone_android e324 909 | phone_bluetooth_speaker e61b 910 | phone_callback e649 911 | phone_disabled e9cc 912 | phone_enabled e9cd 913 | phone_forwarded e61c 914 | phone_in_talk e61d 915 | phone_iphone e325 916 | phone_locked e61e 917 | phone_missed e61f 918 | phone_paused e620 919 | phonelink e326 920 | phonelink_erase e0db 921 | phonelink_lock e0dc 922 | phonelink_off e327 923 | phonelink_ring e0dd 924 | phonelink_setup e0de 925 | photo e410 926 | photo_album e411 927 | photo_camera e412 928 | photo_filter e43b 929 | photo_library e413 930 | photo_size_select_actual e432 931 | photo_size_select_large e433 932 | photo_size_select_small e434 933 | picture_as_pdf e415 934 | picture_in_picture e8aa 935 | picture_in_picture_alt e911 936 | pie_chart e6c4 937 | pie_chart_outline f044 938 | pin_drop e55e 939 | place e55f 940 | plagiarism ea5a 941 | play_arrow e037 942 | play_circle_fill e038 943 | play_circle_filled e038 944 | play_circle_outline e039 945 | play_for_work e906 946 | playlist_add e03b 947 | playlist_add_check e065 948 | playlist_play e05f 949 | plumbing f107 950 | plus_one e800 951 | point_of_sale f17e 952 | policy ea17 953 | poll e801 954 | polymer e8ab 955 | pool eb48 956 | portable_wifi_off e0ce 957 | portrait e416 958 | post_add ea20 959 | power e63c 960 | power_input e336 961 | power_off e646 962 | power_settings_new e8ac 963 | precision_manufacturing f049 964 | pregnant_woman e91e 965 | present_to_all e0df 966 | preview f1c5 967 | print e8ad 968 | print_disabled e9cf 969 | priority_high e645 970 | privacy_tip f0dc 971 | psychology ea4a 972 | public e80b 973 | public_off f1ca 974 | publish e255 975 | published_with_changes f232 976 | push_pin f10d 977 | qr_code ef6b 978 | qr_code_2 e00a 979 | qr_code_scanner f206 980 | query_builder e8ae 981 | question_answer e8af 982 | queue e03c 983 | queue_music e03d 984 | queue_play_next e066 985 | quick_contacts_dialer e0cf 986 | quick_contacts_mail e0d0 987 | quickreply ef6c 988 | radio e03e 989 | radio_button_checked e837 990 | radio_button_off e836 991 | radio_button_on e837 992 | radio_button_unchecked e836 993 | rate_review e560 994 | read_more ef6d 995 | receipt e8b0 996 | receipt_long ef6e 997 | recent_actors e03f 998 | record_voice_over e91f 999 | redeem e8b1 1000 | redo e15a 1001 | reduce_capacity f21c 1002 | refresh e5d5 1003 | remove e15b 1004 | remove_circle e15c 1005 | remove_circle_outline e15d 1006 | remove_from_queue e067 1007 | remove_red_eye e417 1008 | remove_shopping_cart e928 1009 | reorder e8fe 1010 | repeat e040 1011 | repeat_one e041 1012 | replay e042 1013 | replay_10 e059 1014 | replay_30 e05a 1015 | replay_5 e05b 1016 | reply e15e 1017 | reply_all e15f 1018 | report e160 1019 | report_gmailerrorred f052 1020 | report_off e170 1021 | report_problem e8b2 1022 | request_page f22c 1023 | request_quote f1b6 1024 | restaurant e56c 1025 | restaurant_menu e561 1026 | restore e8b3 1027 | restore_from_trash e938 1028 | restore_page e929 1029 | rice_bowl f1f5 1030 | ring_volume e0d1 1031 | roofing f201 1032 | room e8b4 1033 | room_preferences f1b8 1034 | room_service eb49 1035 | rotate_90_degrees_ccw e418 1036 | rotate_left e419 1037 | rotate_right e41a 1038 | rounded_corner e920 1039 | router e328 1040 | rowing e921 1041 | rss_feed e0e5 1042 | rule f1c2 1043 | rule_folder f1c9 1044 | run_circle ef6f 1045 | rv_hookup e642 1046 | sanitizer f21d 1047 | satellite e562 1048 | save e161 1049 | save_alt e171 1050 | scanner e329 1051 | scatter_plot e268 1052 | schedule e8b5 1053 | school e80c 1054 | science ea4b 1055 | score e269 1056 | screen_lock_landscape e1be 1057 | screen_lock_portrait e1bf 1058 | screen_lock_rotation e1c0 1059 | screen_rotation e1c1 1060 | screen_share e0e2 1061 | sd_card e623 1062 | sd_card_alert f057 1063 | sd_storage e1c2 1064 | search e8b6 1065 | search_off ea76 1066 | security e32a 1067 | select_all e162 1068 | self_improvement ea78 1069 | send e163 1070 | sensor_door f1b5 1071 | sensor_window f1b4 1072 | sentiment_dissatisfied e811 1073 | sentiment_neutral e812 1074 | sentiment_satisfied e813 1075 | sentiment_satisfied_alt e0ed 1076 | sentiment_very_dissatisfied e814 1077 | sentiment_very_satisfied e815 1078 | set_meal f1ea 1079 | settings e8b8 1080 | settings_applications e8b9 1081 | settings_backup_restore e8ba 1082 | settings_bluetooth e8bb 1083 | settings_brightness e8bd 1084 | settings_cell e8bc 1085 | settings_display e8bd 1086 | settings_ethernet e8be 1087 | settings_input_antenna e8bf 1088 | settings_input_component e8c0 1089 | settings_input_composite e8c1 1090 | settings_input_hdmi e8c2 1091 | settings_input_svideo e8c3 1092 | settings_overscan e8c4 1093 | settings_phone e8c5 1094 | settings_power e8c6 1095 | settings_remote e8c7 1096 | settings_system_daydream e1c3 1097 | settings_voice e8c8 1098 | share e80d 1099 | shop e8c9 1100 | shop_two e8ca 1101 | shopping_bag f1cc 1102 | shopping_basket e8cb 1103 | shopping_cart e8cc 1104 | short_text e261 1105 | show_chart e6e1 1106 | shuffle e043 1107 | shutter_speed e43d 1108 | sick f220 1109 | signal_cellular_4_bar e1c8 1110 | signal_cellular_alt e202 1111 | signal_cellular_connected_no_internet_4_bar e1cd 1112 | signal_cellular_no_sim e1ce 1113 | signal_cellular_null e1cf 1114 | signal_cellular_off e1d0 1115 | signal_wifi_4_bar e1d8 1116 | signal_wifi_4_bar_lock e1d9 1117 | signal_wifi_off e1da 1118 | sim_card e32b 1119 | single_bed ea48 1120 | skip_next e044 1121 | skip_previous e045 1122 | slideshow e41b 1123 | slow_motion_video e068 1124 | smart_button f1c1 1125 | smartphone e32c 1126 | smoke_free eb4a 1127 | smoking_rooms eb4b 1128 | sms e625 1129 | sms_failed e626 1130 | snippet_folder f1c7 1131 | snooze e046 1132 | soap f1b2 1133 | sort e164 1134 | sort_by_alpha e053 1135 | source f1c4 1136 | south f1e3 1137 | south_east f1e4 1138 | south_west f1e5 1139 | spa eb4c 1140 | space_bar e256 1141 | speaker e32d 1142 | speaker_group e32e 1143 | speaker_notes e8cd 1144 | speaker_notes_off e92a 1145 | speaker_phone e0d2 1146 | speed e9e4 1147 | spellcheck e8ce 1148 | sports ea30 1149 | sports_bar f1f3 1150 | sports_baseball ea51 1151 | sports_basketball ea26 1152 | sports_cricket ea27 1153 | sports_esports ea28 1154 | sports_football ea29 1155 | sports_golf ea2a 1156 | sports_handball ea33 1157 | sports_hockey ea2b 1158 | sports_kabaddi ea34 1159 | sports_mma ea2c 1160 | sports_motorsports ea2d 1161 | sports_rugby ea2e 1162 | sports_soccer ea2f 1163 | sports_tennis ea32 1164 | sports_volleyball ea31 1165 | square_foot ea49 1166 | stacked_line_chart f22b 1167 | stairs f1a9 1168 | star e838 1169 | star_border e83a 1170 | star_border_purple500 f099 1171 | star_half e839 1172 | star_outline f06f 1173 | star_purple500 f09a 1174 | star_rate f0ec 1175 | stars e8d0 1176 | stay_current_landscape e0d3 1177 | stay_current_portrait e0d4 1178 | stay_primary_landscape e0d5 1179 | stay_primary_portrait e0d6 1180 | sticky_note_2 f1fc 1181 | stop e047 1182 | stop_circle ef71 1183 | stop_screen_share e0e3 1184 | storage e1db 1185 | store e8d1 1186 | store_mall_directory e563 1187 | storefront ea12 1188 | straighten e41c 1189 | streetview e56e 1190 | strikethrough_s e257 1191 | stroller f1ae 1192 | style e41d 1193 | subdirectory_arrow_left e5d9 1194 | subdirectory_arrow_right e5da 1195 | subject e8d2 1196 | subscript f111 1197 | subscriptions e064 1198 | subtitles e048 1199 | subtitles_off ef72 1200 | subway e56f 1201 | superscript f112 1202 | supervised_user_circle e939 1203 | supervisor_account e8d3 1204 | support ef73 1205 | support_agent f0e2 1206 | surround_sound e049 1207 | swap_calls e0d7 1208 | swap_horiz e8d4 1209 | swap_horizontal_circle e933 1210 | swap_vert e8d5 1211 | swap_vert_circle e8d6 1212 | swap_vertical_circle e8d6 1213 | switch_camera e41e 1214 | switch_left f1d1 1215 | switch_right f1d2 1216 | switch_video e41f 1217 | sync e627 1218 | sync_alt ea18 1219 | sync_disabled e628 1220 | sync_problem e629 1221 | system_update e62a 1222 | system_update_alt e8d7 1223 | system_update_tv e8d7 1224 | tab e8d8 1225 | tab_unselected e8d9 1226 | table_chart e265 1227 | table_rows f101 1228 | table_view f1be 1229 | tablet e32f 1230 | tablet_android e330 1231 | tablet_mac e331 1232 | tag_faces e420 1233 | tap_and_play e62b 1234 | tapas f1e9 1235 | terrain e564 1236 | text_fields e262 1237 | text_format e165 1238 | text_rotate_up e93a 1239 | text_rotate_vertical e93b 1240 | text_rotation_angledown e93c 1241 | text_rotation_angleup e93d 1242 | text_rotation_down e93e 1243 | text_rotation_none e93f 1244 | text_snippet f1c6 1245 | textsms e0d8 1246 | texture e421 1247 | theaters e8da 1248 | thermostat f076 1249 | thumb_down e8db 1250 | thumb_down_alt e816 1251 | thumb_up e8dc 1252 | thumb_up_alt e817 1253 | thumbs_up_down e8dd 1254 | time_to_leave e62c 1255 | timelapse e422 1256 | timeline e922 1257 | timer e425 1258 | timer_10 e423 1259 | timer_3 e424 1260 | timer_off e426 1261 | title e264 1262 | toc e8de 1263 | today e8df 1264 | toggle_off e9f5 1265 | toggle_on e9f6 1266 | toll e8e0 1267 | tonality e427 1268 | topic f1c8 1269 | touch_app e913 1270 | tour ef75 1271 | toys e332 1272 | track_changes e8e1 1273 | traffic e565 1274 | train e570 1275 | tram e571 1276 | transfer_within_a_station e572 1277 | transform e428 1278 | transit_enterexit e579 1279 | translate e8e2 1280 | trending_down e8e3 1281 | trending_flat e8e4 1282 | trending_neutral e8e4 1283 | trending_up e8e5 1284 | trip_origin e57b 1285 | tty f1aa 1286 | tune e429 1287 | turned_in e8e6 1288 | turned_in_not e8e7 1289 | tv e333 1290 | tv_off e647 1291 | two_wheeler e9f9 1292 | umbrella f1ad 1293 | unarchive e169 1294 | undo e166 1295 | unfold_less e5d6 1296 | unfold_more e5d7 1297 | unpublished f236 1298 | unsubscribe e0eb 1299 | update e923 1300 | update_disabled e075 1301 | upgrade f0fb 1302 | upload f09b 1303 | usb e1e0 1304 | verified ef76 1305 | verified_user e8e8 1306 | vertical_align_bottom e258 1307 | vertical_align_center e259 1308 | vertical_align_top e25a 1309 | vertical_distribute e076 1310 | vertical_split e949 1311 | vibration e62d 1312 | video_call e070 1313 | video_collection e04a 1314 | video_label e071 1315 | video_library e04a 1316 | video_settings ea75 1317 | videocam e04b 1318 | videocam_off e04c 1319 | videogame_asset e338 1320 | view_agenda e8e9 1321 | view_array e8ea 1322 | view_carousel e8eb 1323 | view_column e8ec 1324 | view_comfortable e42a 1325 | view_comfy e42a 1326 | view_compact e42b 1327 | view_day e8ed 1328 | view_headline e8ee 1329 | view_list e8ef 1330 | view_module e8f0 1331 | view_quilt e8f1 1332 | view_sidebar f114 1333 | view_stream e8f2 1334 | view_week e8f3 1335 | vignette e435 1336 | visibility e8f4 1337 | visibility_off e8f5 1338 | voice_chat e62e 1339 | voice_over_off e94a 1340 | voicemail e0d9 1341 | volume_down e04d 1342 | volume_mute e04e 1343 | volume_off e04f 1344 | volume_up e050 1345 | vpn_key e0da 1346 | vpn_lock e62f 1347 | wallet_giftcard e8f6 1348 | wallet_membership e8f7 1349 | wallet_travel e8f8 1350 | wallpaper e1bc 1351 | warning e002 1352 | warning_amber f083 1353 | wash f1b1 1354 | watch e334 1355 | watch_later e924 1356 | water_damage f203 1357 | waves e176 1358 | wb_auto e42c 1359 | wb_cloudy e42d 1360 | wb_incandescent e42e 1361 | wb_iridescent e436 1362 | wb_sunny e430 1363 | wc e63d 1364 | web e051 1365 | web_asset e069 1366 | weekend e16b 1367 | west f1e6 1368 | whatshot e80e 1369 | wheelchair_pickup f1ab 1370 | where_to_vote e177 1371 | widgets e1bd 1372 | wifi e63e 1373 | wifi_calling ef77 1374 | wifi_lock e1e1 1375 | wifi_off e648 1376 | wifi_protected_setup f0fc 1377 | wifi_tethering e1e2 1378 | wine_bar f1e8 1379 | work e8f9 1380 | work_off e942 1381 | work_outline e943 1382 | wrap_text e25b 1383 | wrong_location ef78 1384 | wysiwyg f1c3 1385 | youtube_searched_for e8fa 1386 | zoom_in e8ff 1387 | zoom_out e900 1388 | zoom_out_map e56b 1389 | -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/MaterialIconsOutlined-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/fonts/material-design-icons/font/MaterialIconsOutlined-Regular.otf -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/MaterialIconsRound-Regular.codepoints: -------------------------------------------------------------------------------- 1 | 360 e577 2 | 3d_rotation e84d 3 | 4k e072 4 | 5g ef38 5 | 6_ft_apart f21e 6 | ac_unit eb3b 7 | access_alarm e190 8 | access_alarms e191 9 | access_time e192 10 | accessibility e84e 11 | accessibility_new e92c 12 | accessible e914 13 | accessible_forward e934 14 | account_balance e84f 15 | account_balance_wallet e850 16 | account_box e851 17 | account_circle e853 18 | account_tree e97a 19 | ad_units ef39 20 | adb e60e 21 | add e145 22 | add_a_photo e439 23 | add_alarm e193 24 | add_alert e003 25 | add_box e146 26 | add_business e729 27 | add_circle e147 28 | add_circle_outline e148 29 | add_comment e266 30 | add_ic_call e97c 31 | add_location e567 32 | add_location_alt ef3a 33 | add_photo_alternate e43e 34 | add_road ef3b 35 | add_shopping_cart e854 36 | add_task f23a 37 | add_to_home_screen e1fe 38 | add_to_photos e39d 39 | add_to_queue e05c 40 | addchart ef3c 41 | adjust e39e 42 | admin_panel_settings ef3d 43 | agriculture ea79 44 | airline_seat_flat e630 45 | airline_seat_flat_angled e631 46 | airline_seat_individual_suite e632 47 | airline_seat_legroom_extra e633 48 | airline_seat_legroom_normal e634 49 | airline_seat_legroom_reduced e635 50 | airline_seat_recline_extra e636 51 | airline_seat_recline_normal e637 52 | airplanemode_active e195 53 | airplanemode_inactive e194 54 | airplanemode_off e194 55 | airplanemode_on e195 56 | airplay e055 57 | airport_shuttle eb3c 58 | alarm e855 59 | alarm_add e856 60 | alarm_off e857 61 | alarm_on e858 62 | album e019 63 | align_horizontal_center e00f 64 | align_horizontal_left e00d 65 | align_horizontal_right e010 66 | align_vertical_bottom e015 67 | align_vertical_center e011 68 | align_vertical_top e00c 69 | all_inbox e97f 70 | all_inclusive eb3d 71 | all_out e90b 72 | alt_route f184 73 | alternate_email e0e6 74 | amp_stories ea13 75 | analytics ef3e 76 | anchor f1cd 77 | android e859 78 | announcement e85a 79 | apartment ea40 80 | api f1b7 81 | app_blocking ef3f 82 | app_settings_alt ef41 83 | apps e5c3 84 | architecture ea3b 85 | archive e149 86 | arrow_back e5c4 87 | arrow_back_ios e5e0 88 | arrow_circle_down f181 89 | arrow_circle_up f182 90 | arrow_downward e5db 91 | arrow_drop_down e5c5 92 | arrow_drop_down_circle e5c6 93 | arrow_drop_up e5c7 94 | arrow_forward e5c8 95 | arrow_forward_ios e5e1 96 | arrow_left e5de 97 | arrow_right e5df 98 | arrow_right_alt e941 99 | arrow_upward e5d8 100 | art_track e060 101 | article ef42 102 | aspect_ratio e85b 103 | assessment e85c 104 | assignment e85d 105 | assignment_ind e85e 106 | assignment_late e85f 107 | assignment_return e860 108 | assignment_returned e861 109 | assignment_turned_in e862 110 | assistant e39f 111 | assistant_photo e3a0 112 | atm e573 113 | attach_email ea5e 114 | attach_file e226 115 | attach_money e227 116 | attachment e2bc 117 | attribution efdb 118 | audiotrack e3a1 119 | auto_delete ea4c 120 | autorenew e863 121 | av_timer e01b 122 | baby_changing_station f19b 123 | backpack f19c 124 | backspace e14a 125 | backup e864 126 | backup_table ef43 127 | ballot e172 128 | bar_chart e26b 129 | batch_prediction f0f5 130 | bathtub ea41 131 | battery_alert e19c 132 | battery_charging_full e1a3 133 | battery_full e1a4 134 | battery_std e1a5 135 | battery_unknown e1a6 136 | beach_access eb3e 137 | bedtime ef44 138 | beenhere e52d 139 | bento f1f4 140 | bike_scooter ef45 141 | biotech ea3a 142 | block e14b 143 | bluetooth e1a7 144 | bluetooth_audio e60f 145 | bluetooth_connected e1a8 146 | bluetooth_disabled e1a9 147 | bluetooth_searching e1aa 148 | blur_circular e3a2 149 | blur_linear e3a3 150 | blur_off e3a4 151 | blur_on e3a5 152 | book e865 153 | book_online f217 154 | bookmark e866 155 | bookmark_border e867 156 | bookmark_outline e867 157 | bookmarks e98b 158 | border_all e228 159 | border_bottom e229 160 | border_clear e22a 161 | border_horizontal e22c 162 | border_inner e22d 163 | border_left e22e 164 | border_outer e22f 165 | border_right e230 166 | border_style e231 167 | border_top e232 168 | border_vertical e233 169 | branding_watermark e06b 170 | brightness_1 e3a6 171 | brightness_2 e3a7 172 | brightness_3 e3a8 173 | brightness_4 e3a9 174 | brightness_5 e3aa 175 | brightness_6 e3ab 176 | brightness_7 e3ac 177 | brightness_auto e1ab 178 | brightness_high e1ac 179 | brightness_low e1ad 180 | brightness_medium e1ae 181 | broken_image e3ad 182 | browser_not_supported ef47 183 | brush e3ae 184 | bubble_chart e6dd 185 | bug_report e868 186 | build e869 187 | build_circle ef48 188 | burst_mode e43c 189 | business e0af 190 | business_center eb3f 191 | cached e86a 192 | cake e7e9 193 | calculate ea5f 194 | calendar_today e935 195 | calendar_view_day e936 196 | call e0b0 197 | call_end e0b1 198 | call_made e0b2 199 | call_merge e0b3 200 | call_missed e0b4 201 | call_missed_outgoing e0e4 202 | call_received e0b5 203 | call_split e0b6 204 | call_to_action e06c 205 | camera e3af 206 | camera_alt e3b0 207 | camera_enhance e8fc 208 | camera_front e3b1 209 | camera_rear e3b2 210 | camera_roll e3b3 211 | campaign ef49 212 | cancel e5c9 213 | cancel_presentation e0e9 214 | cancel_schedule_send ea39 215 | card_giftcard e8f6 216 | card_membership e8f7 217 | card_travel e8f8 218 | carpenter f1f8 219 | casino eb40 220 | cast e307 221 | cast_connected e308 222 | cast_for_education efec 223 | category e574 224 | center_focus_strong e3b4 225 | center_focus_weak e3b5 226 | change_history e86b 227 | charging_station f19d 228 | chat e0b7 229 | chat_bubble e0ca 230 | chat_bubble_outline e0cb 231 | check e5ca 232 | check_box e834 233 | check_box_outline_blank e835 234 | check_circle e86c 235 | check_circle_outline e92d 236 | checkroom f19e 237 | chevron_left e5cb 238 | chevron_right e5cc 239 | child_care eb41 240 | child_friendly eb42 241 | chrome_reader_mode e86d 242 | class e86e 243 | clean_hands f21f 244 | cleaning_services f0ff 245 | clear e14c 246 | clear_all e0b8 247 | close e5cd 248 | close_fullscreen f1cf 249 | closed_caption e01c 250 | closed_caption_disabled f1dc 251 | cloud e2bd 252 | cloud_circle e2be 253 | cloud_done e2bf 254 | cloud_download e2c0 255 | cloud_off e2c1 256 | cloud_queue e2c2 257 | cloud_upload e2c3 258 | code e86f 259 | collections e3b6 260 | collections_bookmark e431 261 | color_lens e3b7 262 | colorize e3b8 263 | comment e0b9 264 | comment_bank ea4e 265 | commute e940 266 | compare e3b9 267 | compare_arrows e915 268 | compass_calibration e57c 269 | computer e30a 270 | confirmation_num e638 271 | confirmation_number e638 272 | connect_without_contact f223 273 | construction ea3c 274 | contact_mail e0d0 275 | contact_page f22e 276 | contact_phone e0cf 277 | contact_support e94c 278 | contactless ea71 279 | contacts e0ba 280 | content_copy f08a 281 | content_cut f08b 282 | content_paste f098 283 | control_camera e074 284 | control_point e3ba 285 | control_point_duplicate e3bb 286 | copy f08a 287 | copyright e90c 288 | coronavirus f221 289 | corporate_fare f1d0 290 | countertops f1f7 291 | create e150 292 | create_new_folder e2cc 293 | credit_card e870 294 | crop e3be 295 | crop_16_9 e3bc 296 | crop_3_2 e3bd 297 | crop_5_4 e3bf 298 | crop_7_5 e3c0 299 | crop_din e3c1 300 | crop_free e3c2 301 | crop_landscape e3c3 302 | crop_original e3c4 303 | crop_portrait e3c5 304 | crop_rotate e437 305 | crop_square e3c6 306 | cut f08b 307 | dashboard e871 308 | data_usage e1af 309 | date_range e916 310 | deck ea42 311 | dehaze e3c7 312 | delete e872 313 | delete_forever e92b 314 | delete_outline e92e 315 | delete_sweep e16c 316 | departure_board e576 317 | description e873 318 | design_services f10a 319 | desktop_access_disabled e99d 320 | desktop_mac e30b 321 | desktop_windows e30c 322 | details e3c8 323 | developer_board e30d 324 | developer_mode e1b0 325 | device_hub e335 326 | device_unknown e339 327 | devices e1b1 328 | devices_other e337 329 | dialer_sip e0bb 330 | dialpad e0bc 331 | directions e52e 332 | directions_bike e52f 333 | directions_boat e532 334 | directions_bus e530 335 | directions_car e531 336 | directions_ferry e532 337 | directions_off f10f 338 | directions_railway e534 339 | directions_run e566 340 | directions_subway e533 341 | directions_train e534 342 | directions_transit e535 343 | directions_walk e536 344 | disabled_by_default f230 345 | disc_full e610 346 | dns e875 347 | do_disturb f08c 348 | do_disturb_alt f08d 349 | do_disturb_off f08e 350 | do_disturb_on f08f 351 | do_not_step f19f 352 | do_not_touch f1b0 353 | dock e30e 354 | domain e7ee 355 | domain_disabled e0ef 356 | domain_verification ef4c 357 | done e876 358 | done_all e877 359 | done_outline e92f 360 | donut_large e917 361 | donut_small e918 362 | double_arrow ea50 363 | download f090 364 | download_done f091 365 | drafts e151 366 | drag_handle e25d 367 | drag_indicator e945 368 | drive_eta e613 369 | dry f1b3 370 | duo e9a5 371 | dvr e1b2 372 | dynamic_feed ea14 373 | dynamic_form f1bf 374 | east f1df 375 | eco ea35 376 | edit e3c9 377 | edit_attributes e578 378 | edit_location e568 379 | edit_road ef4d 380 | eject e8fb 381 | elderly f21a 382 | electric_bike eb1b 383 | electric_car eb1c 384 | electric_moped eb1d 385 | electric_rickshaw eb1e 386 | electric_scooter eb1f 387 | electrical_services f102 388 | elevator f1a0 389 | email e0be 390 | emoji_emotions ea22 391 | emoji_events ea23 392 | emoji_flags ea1a 393 | emoji_food_beverage ea1b 394 | emoji_nature ea1c 395 | emoji_objects ea24 396 | emoji_people ea1d 397 | emoji_symbols ea1e 398 | emoji_transportation ea1f 399 | engineering ea3d 400 | enhance_photo_translate e8fc 401 | enhanced_encryption e63f 402 | equalizer e01d 403 | error e000 404 | error_outline e001 405 | escalator f1a1 406 | escalator_warning f1ac 407 | euro ea15 408 | euro_symbol e926 409 | ev_station e56d 410 | event e878 411 | event_available e614 412 | event_busy e615 413 | event_note e616 414 | event_seat e903 415 | exit_to_app e879 416 | expand_less e5ce 417 | expand_more e5cf 418 | explicit e01e 419 | explore e87a 420 | explore_off e9a8 421 | exposure e3ca 422 | exposure_minus_1 e3cb 423 | exposure_minus_2 e3cc 424 | exposure_neg_1 e3cb 425 | exposure_neg_2 e3cc 426 | exposure_plus_1 e3cd 427 | exposure_plus_2 e3ce 428 | exposure_zero e3cf 429 | extension e87b 430 | face e87c 431 | face_unlock f008 432 | facebook f234 433 | fact_check f0c5 434 | family_restroom f1a2 435 | fast_forward e01f 436 | fast_rewind e020 437 | fastfood e57a 438 | favorite e87d 439 | favorite_border e87e 440 | favorite_outline e87e 441 | featured_play_list e06d 442 | featured_video e06e 443 | feedback e87f 444 | fence f1f6 445 | fiber_dvr e05d 446 | fiber_manual_record e061 447 | fiber_new e05e 448 | fiber_pin e06a 449 | fiber_smart_record e062 450 | file_copy e173 451 | filter e3d3 452 | filter_1 e3d0 453 | filter_2 e3d1 454 | filter_3 e3d2 455 | filter_4 e3d4 456 | filter_5 e3d5 457 | filter_6 e3d6 458 | filter_7 e3d7 459 | filter_8 e3d8 460 | filter_9 e3d9 461 | filter_9_plus e3da 462 | filter_alt ef4f 463 | filter_b_and_w e3db 464 | filter_center_focus e3dc 465 | filter_drama e3dd 466 | filter_frames e3de 467 | filter_hdr e3df 468 | filter_list e152 469 | filter_none e3e0 470 | filter_tilt_shift e3e2 471 | filter_vintage e3e3 472 | find_in_page e880 473 | find_replace e881 474 | fingerprint e90d 475 | fire_extinguisher f1d8 476 | fireplace ea43 477 | first_page e5dc 478 | fitness_center eb43 479 | flag e153 480 | flaky ef50 481 | flare e3e4 482 | flash_auto e3e5 483 | flash_off e3e6 484 | flash_on e3e7 485 | flight e539 486 | flight_land e904 487 | flight_takeoff e905 488 | flip e3e8 489 | flip_camera_android ea37 490 | flip_camera_ios ea38 491 | flip_to_back e882 492 | flip_to_front e883 493 | folder e2c7 494 | folder_open e2c8 495 | folder_shared e2c9 496 | folder_special e617 497 | follow_the_signs f222 498 | font_download e167 499 | food_bank f1f2 500 | format_align_center e234 501 | format_align_justify e235 502 | format_align_left e236 503 | format_align_right e237 504 | format_bold e238 505 | format_clear e239 506 | format_color_reset e23b 507 | format_indent_decrease e23d 508 | format_indent_increase e23e 509 | format_italic e23f 510 | format_line_spacing e240 511 | format_list_bulleted e241 512 | format_list_numbered e242 513 | format_list_numbered_rtl e267 514 | format_paint e243 515 | format_quote e244 516 | format_shapes e25e 517 | format_size e245 518 | format_strikethrough e246 519 | format_textdirection_l_to_r e247 520 | format_textdirection_r_to_l e248 521 | format_underline e249 522 | format_underlined e249 523 | forum e0bf 524 | forward e154 525 | forward_10 e056 526 | forward_30 e057 527 | forward_5 e058 528 | forward_to_inbox f187 529 | foundation f200 530 | free_breakfast eb44 531 | fullscreen e5d0 532 | fullscreen_exit e5d1 533 | functions e24a 534 | g_translate e927 535 | gamepad e30f 536 | games e021 537 | gavel e90e 538 | gesture e155 539 | get_app e884 540 | gif e908 541 | golf_course eb45 542 | gps_fixed e1b3 543 | gps_not_fixed e1b4 544 | gps_off e1b5 545 | grade e885 546 | gradient e3e9 547 | grading ea4f 548 | grain e3ea 549 | graphic_eq e1b8 550 | grass f205 551 | grid_off e3eb 552 | grid_on e3ec 553 | group e7ef 554 | group_add e7f0 555 | group_work e886 556 | groups f233 557 | handyman f10b 558 | hd e052 559 | hdr_off e3ed 560 | hdr_on e3ee 561 | hdr_strong e3f1 562 | hdr_weak e3f2 563 | headset e310 564 | headset_mic e311 565 | healing e3f3 566 | hearing e023 567 | hearing_disabled f104 568 | height ea16 569 | help e887 570 | help_center f1c0 571 | help_outline e8fd 572 | high_quality e024 573 | highlight e25f 574 | highlight_alt ef52 575 | highlight_off e888 576 | highlight_remove e888 577 | history e889 578 | history_edu ea3e 579 | history_toggle_off f17d 580 | home e88a 581 | home_repair_service f100 582 | home_work ea09 583 | horizontal_distribute e014 584 | horizontal_rule f108 585 | horizontal_split e947 586 | hot_tub eb46 587 | hotel e53a 588 | hourglass_bottom ea5c 589 | hourglass_disabled ef53 590 | hourglass_empty e88b 591 | hourglass_full e88c 592 | hourglass_top ea5b 593 | house ea44 594 | house_siding f202 595 | how_to_reg e174 596 | how_to_vote e175 597 | http e902 598 | https e88d 599 | hvac f10e 600 | image e3f4 601 | image_aspect_ratio e3f5 602 | image_not_supported f116 603 | image_search e43f 604 | import_contacts e0e0 605 | import_export e0c3 606 | important_devices e912 607 | inbox e156 608 | indeterminate_check_box e909 609 | info e88e 610 | info_outline e88f 611 | input e890 612 | insert_chart e24b 613 | insert_chart_outlined e26a 614 | insert_comment e24c 615 | insert_drive_file e24d 616 | insert_emoticon e24e 617 | insert_invitation e24f 618 | insert_link e250 619 | insert_photo e251 620 | insights f092 621 | integration_instructions ef54 622 | invert_colors e891 623 | invert_colors_off e0c4 624 | invert_colors_on e891 625 | iso e3f6 626 | keyboard e312 627 | keyboard_arrow_down e313 628 | keyboard_arrow_left e314 629 | keyboard_arrow_right e315 630 | keyboard_arrow_up e316 631 | keyboard_backspace e317 632 | keyboard_capslock e318 633 | keyboard_control e5d3 634 | keyboard_hide e31a 635 | keyboard_return e31b 636 | keyboard_tab e31c 637 | keyboard_voice e31d 638 | king_bed ea45 639 | kitchen eb47 640 | label e892 641 | label_important e937 642 | label_important_outline e948 643 | label_off e9b6 644 | label_outline e893 645 | landscape e3f7 646 | language e894 647 | laptop e31e 648 | laptop_chromebook e31f 649 | laptop_mac e320 650 | laptop_windows e321 651 | last_page e5dd 652 | launch e895 653 | layers e53b 654 | layers_clear e53c 655 | leaderboard f20c 656 | leak_add e3f8 657 | leak_remove e3f9 658 | leave_bags_at_home f23b 659 | legend_toggle f11b 660 | lens e3fa 661 | library_add e02e 662 | library_add_check e9b7 663 | library_books e02f 664 | library_music e030 665 | lightbulb_outline e90f 666 | line_style e919 667 | line_weight e91a 668 | linear_scale e260 669 | link e157 670 | link_off e16f 671 | linked_camera e438 672 | list e896 673 | list_alt e0ee 674 | live_help e0c6 675 | live_tv e639 676 | local_activity e53f 677 | local_airport e53d 678 | local_atm e53e 679 | local_attraction e53f 680 | local_bar e540 681 | local_cafe e541 682 | local_car_wash e542 683 | local_convenience_store e543 684 | local_dining e556 685 | local_drink e544 686 | local_fire_department ef55 687 | local_florist e545 688 | local_gas_station e546 689 | local_grocery_store e547 690 | local_hospital e548 691 | local_hotel e549 692 | local_laundry_service e54a 693 | local_library e54b 694 | local_mall e54c 695 | local_movies e54d 696 | local_offer e54e 697 | local_parking e54f 698 | local_pharmacy e550 699 | local_phone e551 700 | local_pizza e552 701 | local_play e553 702 | local_police ef56 703 | local_post_office e554 704 | local_print_shop e555 705 | local_printshop e555 706 | local_restaurant e556 707 | local_see e557 708 | local_shipping e558 709 | local_taxi e559 710 | location_city e7f1 711 | location_disabled e1b6 712 | location_history e55a 713 | location_off e0c7 714 | location_on e0c8 715 | location_searching e1b7 716 | lock e897 717 | lock_open e898 718 | lock_outline e899 719 | login ea77 720 | looks e3fc 721 | looks_3 e3fb 722 | looks_4 e3fd 723 | looks_5 e3fe 724 | looks_6 e3ff 725 | looks_one e400 726 | looks_two e401 727 | loop e028 728 | loupe e402 729 | low_priority e16d 730 | loyalty e89a 731 | luggage f235 732 | mail e158 733 | mail_outline e0e1 734 | map e55b 735 | maps_ugc ef58 736 | mark_chat_read f18b 737 | mark_chat_unread f189 738 | mark_email_read f18c 739 | mark_email_unread f18a 740 | markunread e159 741 | markunread_mailbox e89b 742 | masks f218 743 | maximize e930 744 | mediation efa7 745 | medical_services f109 746 | meeting_room eb4f 747 | memory e322 748 | menu e5d2 749 | menu_book ea19 750 | menu_open e9bd 751 | merge_type e252 752 | message e0c9 753 | messenger e0ca 754 | messenger_outline e0cb 755 | mic e029 756 | mic_none e02a 757 | mic_off e02b 758 | microwave f204 759 | military_tech ea3f 760 | minimize e931 761 | miscellaneous_services f10c 762 | missed_video_call e073 763 | mms e618 764 | mobile_friendly e200 765 | mobile_off e201 766 | mobile_screen_share e0e7 767 | mode f097 768 | mode_comment e253 769 | model_training f0cf 770 | monetization_on e263 771 | money e57d 772 | money_off e25c 773 | money_off_csred f038 774 | monochrome_photos e403 775 | mood e7f2 776 | mood_bad e7f3 777 | moped eb28 778 | more e619 779 | more_horiz e5d3 780 | more_time ea5d 781 | more_vert e5d4 782 | motion_photos_on e9c1 783 | motion_photos_pause f227 784 | motion_photos_paused e9c2 785 | motorcycle e91b 786 | mouse e323 787 | move_to_inbox e168 788 | movie e02c 789 | movie_creation e404 790 | movie_filter e43a 791 | multiline_chart e6df 792 | multiple_stop f1b9 793 | multitrack_audio e1b8 794 | museum ea36 795 | music_note e405 796 | music_off e440 797 | music_video e063 798 | my_library_add e02e 799 | my_library_books e02f 800 | my_library_music e030 801 | my_location e55c 802 | nat ef5c 803 | nature e406 804 | nature_people e407 805 | navigate_before e408 806 | navigate_next e409 807 | navigation e55d 808 | near_me e569 809 | near_me_disabled f1ef 810 | network_check e640 811 | network_locked e61a 812 | new_releases e031 813 | next_plan ef5d 814 | next_week e16a 815 | nfc e1bb 816 | night_shelter f1f1 817 | nights_stay ea46 818 | no_backpack f237 819 | no_cell f1a4 820 | no_drinks f1a5 821 | no_encryption e641 822 | no_encryption_gmailerrorred f03f 823 | no_flash f1a6 824 | no_food f1a7 825 | no_luggage f23b 826 | no_meals f1d6 827 | no_meeting_room eb4e 828 | no_photography f1a8 829 | no_sim e0cc 830 | no_stroller f1af 831 | no_transfer f1d5 832 | north f1e0 833 | north_east f1e1 834 | north_west f1e2 835 | not_accessible f0fe 836 | not_interested e033 837 | not_listed_location e575 838 | not_started f0d1 839 | note e06f 840 | note_add e89c 841 | notes e26c 842 | notification_important e004 843 | notifications e7f4 844 | notifications_active e7f7 845 | notifications_none e7f5 846 | notifications_off e7f6 847 | notifications_on e7f7 848 | notifications_paused e7f8 849 | now_wallpaper e1bc 850 | now_widgets e1bd 851 | offline_bolt e932 852 | offline_pin e90a 853 | ondemand_video e63a 854 | online_prediction f0eb 855 | opacity e91c 856 | open_in_browser e89d 857 | open_in_full f1ce 858 | open_in_new e89e 859 | open_with e89f 860 | outbond f228 861 | outdoor_grill ea47 862 | outlet f1d4 863 | outlined_flag e16e 864 | pages e7f9 865 | pageview e8a0 866 | palette e40a 867 | pan_tool e925 868 | panorama e40b 869 | panorama_fish_eye e40c 870 | panorama_fisheye e40c 871 | panorama_horizontal e40d 872 | panorama_vertical e40e 873 | panorama_wide_angle e40f 874 | party_mode e7fa 875 | paste f098 876 | pause e034 877 | pause_circle_filled e035 878 | pause_circle_outline e036 879 | pause_presentation e0ea 880 | payment e8a1 881 | payments ef63 882 | pedal_bike eb29 883 | pending ef64 884 | pending_actions f1bb 885 | people e7fb 886 | people_alt ea21 887 | people_outline e7fc 888 | perm_camera_mic e8a2 889 | perm_contact_cal e8a3 890 | perm_contact_calendar e8a3 891 | perm_data_setting e8a4 892 | perm_device_info e8a5 893 | perm_device_information e8a5 894 | perm_identity e8a6 895 | perm_media e8a7 896 | perm_phone_msg e8a8 897 | perm_scan_wifi e8a9 898 | person e7fd 899 | person_add e7fe 900 | person_add_alt_1 ef65 901 | person_add_disabled e9cb 902 | person_outline e7ff 903 | person_pin e55a 904 | person_pin_circle e56a 905 | person_remove ef66 906 | person_remove_alt_1 ef67 907 | person_search f106 908 | personal_video e63b 909 | pest_control f0fa 910 | pest_control_rodent f0fd 911 | pets e91d 912 | phone e0cd 913 | phone_android e324 914 | phone_bluetooth_speaker e61b 915 | phone_callback e649 916 | phone_disabled e9cc 917 | phone_enabled e9cd 918 | phone_forwarded e61c 919 | phone_in_talk e61d 920 | phone_iphone e325 921 | phone_locked e61e 922 | phone_missed e61f 923 | phone_paused e620 924 | phonelink e326 925 | phonelink_erase e0db 926 | phonelink_lock e0dc 927 | phonelink_off e327 928 | phonelink_ring e0dd 929 | phonelink_setup e0de 930 | photo e410 931 | photo_album e411 932 | photo_camera e412 933 | photo_filter e43b 934 | photo_library e413 935 | photo_size_select_actual e432 936 | photo_size_select_large e433 937 | photo_size_select_small e434 938 | picture_as_pdf e415 939 | picture_in_picture e8aa 940 | picture_in_picture_alt e911 941 | pie_chart e6c4 942 | pie_chart_outline f044 943 | pin_drop e55e 944 | place e55f 945 | plagiarism ea5a 946 | play_arrow e037 947 | play_circle_fill e038 948 | play_circle_filled e038 949 | play_circle_outline e039 950 | play_for_work e906 951 | playlist_add e03b 952 | playlist_add_check e065 953 | playlist_play e05f 954 | plumbing f107 955 | plus_one e800 956 | point_of_sale f17e 957 | policy ea17 958 | poll e801 959 | polymer e8ab 960 | pool eb48 961 | portable_wifi_off e0ce 962 | portrait e416 963 | post_add ea20 964 | power e63c 965 | power_input e336 966 | power_off e646 967 | power_settings_new e8ac 968 | precision_manufacturing f049 969 | pregnant_woman e91e 970 | present_to_all e0df 971 | preview f1c5 972 | print e8ad 973 | print_disabled e9cf 974 | priority_high e645 975 | privacy_tip f0dc 976 | psychology ea4a 977 | public e80b 978 | public_off f1ca 979 | publish e255 980 | published_with_changes f232 981 | push_pin f10d 982 | qr_code ef6b 983 | qr_code_2 e00a 984 | qr_code_scanner f206 985 | query_builder e8ae 986 | question_answer e8af 987 | queue e03c 988 | queue_music e03d 989 | queue_play_next e066 990 | quick_contacts_dialer e0cf 991 | quick_contacts_mail e0d0 992 | quickreply ef6c 993 | radio e03e 994 | radio_button_checked e837 995 | radio_button_off e836 996 | radio_button_on e837 997 | radio_button_unchecked e836 998 | rate_review e560 999 | read_more ef6d 1000 | receipt e8b0 1001 | receipt_long ef6e 1002 | recent_actors e03f 1003 | record_voice_over e91f 1004 | redeem e8b1 1005 | redo e15a 1006 | reduce_capacity f21c 1007 | refresh e5d5 1008 | remove e15b 1009 | remove_circle e15c 1010 | remove_circle_outline e15d 1011 | remove_from_queue e067 1012 | remove_red_eye e417 1013 | remove_shopping_cart e928 1014 | reorder e8fe 1015 | repeat e040 1016 | repeat_one e041 1017 | replay e042 1018 | replay_10 e059 1019 | replay_30 e05a 1020 | replay_5 e05b 1021 | reply e15e 1022 | reply_all e15f 1023 | report e160 1024 | report_gmailerrorred f052 1025 | report_off e170 1026 | report_problem e8b2 1027 | request_page f22c 1028 | request_quote f1b6 1029 | restaurant e56c 1030 | restaurant_menu e561 1031 | restore e8b3 1032 | restore_from_trash e938 1033 | restore_page e929 1034 | rice_bowl f1f5 1035 | ring_volume e0d1 1036 | roofing f201 1037 | room e8b4 1038 | room_preferences f1b8 1039 | room_service eb49 1040 | rotate_90_degrees_ccw e418 1041 | rotate_left e419 1042 | rotate_right e41a 1043 | rounded_corner e920 1044 | router e328 1045 | rowing e921 1046 | rss_feed e0e5 1047 | rule f1c2 1048 | rule_folder f1c9 1049 | run_circle ef6f 1050 | rv_hookup e642 1051 | sanitizer f21d 1052 | satellite e562 1053 | save e161 1054 | save_alt e171 1055 | scanner e329 1056 | scatter_plot e268 1057 | schedule e8b5 1058 | school e80c 1059 | science ea4b 1060 | score e269 1061 | screen_lock_landscape e1be 1062 | screen_lock_portrait e1bf 1063 | screen_lock_rotation e1c0 1064 | screen_rotation e1c1 1065 | screen_share e0e2 1066 | sd_card e623 1067 | sd_card_alert f057 1068 | sd_storage e1c2 1069 | search e8b6 1070 | search_off ea76 1071 | security e32a 1072 | select_all e162 1073 | self_improvement ea78 1074 | send e163 1075 | sensor_door f1b5 1076 | sensor_window f1b4 1077 | sentiment_dissatisfied e811 1078 | sentiment_neutral e812 1079 | sentiment_satisfied e813 1080 | sentiment_satisfied_alt e0ed 1081 | sentiment_very_dissatisfied e814 1082 | sentiment_very_satisfied e815 1083 | set_meal f1ea 1084 | settings e8b8 1085 | settings_applications e8b9 1086 | settings_backup_restore e8ba 1087 | settings_bluetooth e8bb 1088 | settings_brightness e8bd 1089 | settings_cell e8bc 1090 | settings_display e8bd 1091 | settings_ethernet e8be 1092 | settings_input_antenna e8bf 1093 | settings_input_component e8c0 1094 | settings_input_composite e8c1 1095 | settings_input_hdmi e8c2 1096 | settings_input_svideo e8c3 1097 | settings_overscan e8c4 1098 | settings_phone e8c5 1099 | settings_power e8c6 1100 | settings_remote e8c7 1101 | settings_system_daydream e1c3 1102 | settings_voice e8c8 1103 | share e80d 1104 | shop e8c9 1105 | shop_two e8ca 1106 | shopping_bag f1cc 1107 | shopping_basket e8cb 1108 | shopping_cart e8cc 1109 | short_text e261 1110 | show_chart e6e1 1111 | shuffle e043 1112 | shutter_speed e43d 1113 | sick f220 1114 | signal_cellular_4_bar e1c8 1115 | signal_cellular_alt e202 1116 | signal_cellular_connected_no_internet_4_bar e1cd 1117 | signal_cellular_no_sim e1ce 1118 | signal_cellular_null e1cf 1119 | signal_cellular_off e1d0 1120 | signal_wifi_4_bar e1d8 1121 | signal_wifi_4_bar_lock e1d9 1122 | signal_wifi_off e1da 1123 | sim_card e32b 1124 | single_bed ea48 1125 | skip_next e044 1126 | skip_previous e045 1127 | slideshow e41b 1128 | slow_motion_video e068 1129 | smart_button f1c1 1130 | smartphone e32c 1131 | smoke_free eb4a 1132 | smoking_rooms eb4b 1133 | sms e625 1134 | sms_failed e626 1135 | snippet_folder f1c7 1136 | snooze e046 1137 | soap f1b2 1138 | sort e164 1139 | sort_by_alpha e053 1140 | source f1c4 1141 | south f1e3 1142 | south_east f1e4 1143 | south_west f1e5 1144 | spa eb4c 1145 | space_bar e256 1146 | speaker e32d 1147 | speaker_group e32e 1148 | speaker_notes e8cd 1149 | speaker_notes_off e92a 1150 | speaker_phone e0d2 1151 | speed e9e4 1152 | spellcheck e8ce 1153 | sports ea30 1154 | sports_bar f1f3 1155 | sports_baseball ea51 1156 | sports_basketball ea26 1157 | sports_cricket ea27 1158 | sports_esports ea28 1159 | sports_football ea29 1160 | sports_golf ea2a 1161 | sports_handball ea33 1162 | sports_hockey ea2b 1163 | sports_kabaddi ea34 1164 | sports_mma ea2c 1165 | sports_motorsports ea2d 1166 | sports_rugby ea2e 1167 | sports_soccer ea2f 1168 | sports_tennis ea32 1169 | sports_volleyball ea31 1170 | square_foot ea49 1171 | stacked_line_chart f22b 1172 | stairs f1a9 1173 | star e838 1174 | star_border e83a 1175 | star_half e839 1176 | star_outline f06f 1177 | star_rate f0ec 1178 | stars e8d0 1179 | stay_current_landscape e0d3 1180 | stay_current_portrait e0d4 1181 | stay_primary_landscape e0d5 1182 | stay_primary_portrait e0d6 1183 | sticky_note_2 f1fc 1184 | stop e047 1185 | stop_circle ef71 1186 | stop_screen_share e0e3 1187 | storage e1db 1188 | store e8d1 1189 | store_mall_directory e563 1190 | storefront ea12 1191 | straighten e41c 1192 | streetview e56e 1193 | strikethrough_s e257 1194 | stroller f1ae 1195 | style e41d 1196 | subdirectory_arrow_left e5d9 1197 | subdirectory_arrow_right e5da 1198 | subject e8d2 1199 | subscript f111 1200 | subscriptions e064 1201 | subtitles e048 1202 | subtitles_off ef72 1203 | subway e56f 1204 | superscript f112 1205 | supervised_user_circle e939 1206 | supervisor_account e8d3 1207 | support ef73 1208 | support_agent f0e2 1209 | surround_sound e049 1210 | swap_calls e0d7 1211 | swap_horiz e8d4 1212 | swap_horizontal_circle e933 1213 | swap_vert e8d5 1214 | swap_vert_circle e8d6 1215 | swap_vertical_circle e8d6 1216 | switch_camera e41e 1217 | switch_left f1d1 1218 | switch_right f1d2 1219 | switch_video e41f 1220 | sync e627 1221 | sync_alt ea18 1222 | sync_disabled e628 1223 | sync_problem e629 1224 | system_update e62a 1225 | system_update_alt e8d7 1226 | system_update_tv e8d7 1227 | tab e8d8 1228 | tab_unselected e8d9 1229 | table_chart e265 1230 | table_rows f101 1231 | table_view f1be 1232 | tablet e32f 1233 | tablet_android e330 1234 | tablet_mac e331 1235 | tag_faces e420 1236 | tap_and_play e62b 1237 | tapas f1e9 1238 | terrain e564 1239 | text_fields e262 1240 | text_format e165 1241 | text_rotate_up e93a 1242 | text_rotate_vertical e93b 1243 | text_rotation_angledown e93c 1244 | text_rotation_angleup e93d 1245 | text_rotation_down e93e 1246 | text_rotation_none e93f 1247 | text_snippet f1c6 1248 | textsms e0d8 1249 | texture e421 1250 | theaters e8da 1251 | thermostat f076 1252 | thumb_down e8db 1253 | thumb_down_alt e816 1254 | thumb_up e8dc 1255 | thumb_up_alt e817 1256 | thumbs_up_down e8dd 1257 | time_to_leave e62c 1258 | timelapse e422 1259 | timeline e922 1260 | timer e425 1261 | timer_10 e423 1262 | timer_3 e424 1263 | timer_off e426 1264 | title e264 1265 | toc e8de 1266 | today e8df 1267 | toggle_off e9f5 1268 | toggle_on e9f6 1269 | toll e8e0 1270 | tonality e427 1271 | topic f1c8 1272 | touch_app e913 1273 | tour ef75 1274 | toys e332 1275 | track_changes e8e1 1276 | traffic e565 1277 | train e570 1278 | tram e571 1279 | transfer_within_a_station e572 1280 | transform e428 1281 | transit_enterexit e579 1282 | translate e8e2 1283 | trending_down e8e3 1284 | trending_flat e8e4 1285 | trending_neutral e8e4 1286 | trending_up e8e5 1287 | trip_origin e57b 1288 | tty f1aa 1289 | tune e429 1290 | turned_in e8e6 1291 | turned_in_not e8e7 1292 | tv e333 1293 | tv_off e647 1294 | two_wheeler e9f9 1295 | umbrella f1ad 1296 | unarchive e169 1297 | undo e166 1298 | unfold_less e5d6 1299 | unfold_more e5d7 1300 | unpublished f236 1301 | unsubscribe e0eb 1302 | update e923 1303 | update_disabled e075 1304 | upgrade f0fb 1305 | upload f09b 1306 | usb e1e0 1307 | verified ef76 1308 | verified_user e8e8 1309 | vertical_align_bottom e258 1310 | vertical_align_center e259 1311 | vertical_align_top e25a 1312 | vertical_distribute e076 1313 | vertical_split e949 1314 | vibration e62d 1315 | video_call e070 1316 | video_collection e04a 1317 | video_label e071 1318 | video_library e04a 1319 | video_settings ea75 1320 | videocam e04b 1321 | videocam_off e04c 1322 | videogame_asset e338 1323 | view_agenda e8e9 1324 | view_array e8ea 1325 | view_carousel e8eb 1326 | view_column e8ec 1327 | view_comfortable e42a 1328 | view_comfy e42a 1329 | view_compact e42b 1330 | view_day e8ed 1331 | view_headline e8ee 1332 | view_list e8ef 1333 | view_module e8f0 1334 | view_quilt e8f1 1335 | view_sidebar f114 1336 | view_stream e8f2 1337 | view_week e8f3 1338 | vignette e435 1339 | visibility e8f4 1340 | visibility_off e8f5 1341 | voice_chat e62e 1342 | voice_over_off e94a 1343 | voicemail e0d9 1344 | volume_down e04d 1345 | volume_mute e04e 1346 | volume_off e04f 1347 | volume_up e050 1348 | vpn_key e0da 1349 | vpn_lock e62f 1350 | wallet_giftcard e8f6 1351 | wallet_membership e8f7 1352 | wallet_travel e8f8 1353 | wallpaper e1bc 1354 | warning e002 1355 | warning_amber f083 1356 | wash f1b1 1357 | watch e334 1358 | watch_later e924 1359 | water_damage f203 1360 | waves e176 1361 | wb_auto e42c 1362 | wb_cloudy e42d 1363 | wb_incandescent e42e 1364 | wb_iridescent e436 1365 | wb_sunny e430 1366 | wc e63d 1367 | web e051 1368 | web_asset e069 1369 | weekend e16b 1370 | west f1e6 1371 | whatshot e80e 1372 | wheelchair_pickup f1ab 1373 | where_to_vote e177 1374 | widgets e1bd 1375 | wifi e63e 1376 | wifi_calling ef77 1377 | wifi_lock e1e1 1378 | wifi_off e648 1379 | wifi_protected_setup f0fc 1380 | wifi_tethering e1e2 1381 | wine_bar f1e8 1382 | work e8f9 1383 | work_off e942 1384 | work_outline e943 1385 | wrap_text e25b 1386 | wrong_location ef78 1387 | wysiwyg f1c3 1388 | youtube_searched_for e8fa 1389 | zoom_in e8ff 1390 | zoom_out e900 1391 | zoom_out_map e56b 1392 | -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/MaterialIconsRound-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/fonts/material-design-icons/font/MaterialIconsRound-Regular.otf -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/MaterialIconsSharp-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/fonts/material-design-icons/font/MaterialIconsSharp-Regular.otf -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/MaterialIconsTwoTone-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/fonts/material-design-icons/font/MaterialIconsTwoTone-Regular.otf -------------------------------------------------------------------------------- /assets/fonts/material-design-icons/font/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 | 5 | 7 | 8 | 9 | 11 | 12 | 13 | 15 | 16 | 17 | 19 | 20 | ``` 21 | 22 | 23 | -------------------------------------------------------------------------------- /assets/frameworks/materialize/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2018 Materialize 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /assets/frameworks/materialize/README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 |

6 | 7 |

MaterializeCSS

8 | 9 |

10 | Materialize, a CSS Framework based on material design. 11 |
12 | -- Browse the docs -- 13 |
14 |
15 | 16 | Travis CI badge 17 | 18 | 19 | npm version badge 20 | 21 | 22 | CDNJS version badge 23 | 24 | 25 | dependencies Status badge 26 | 27 | 28 | devDependency Status badge 29 | 30 | 31 | Gitter badge 32 | 33 |

34 | 35 | ## Table of Contents 36 | - [Quickstart](#quickstart) 37 | - [Documentation](#documentation) 38 | - [Supported Browsers](#supported-browsers) 39 | - [Changelog](#changelog) 40 | - [Testing](#testing) 41 | - [Contributing](#contributing) 42 | - [Copyright and license](#copyright-and-license) 43 | 44 | ## Quickstart: 45 | Read the [getting started guide](http://materializecss.com/getting-started.html) for more information on how to use materialize. 46 | 47 | - [Download the latest release](https://github.com/Dogfalo/materialize/releases/latest) of materialize directly from GitHub. ([Beta](https://github.com/Dogfalo/materialize/releases/)) 48 | - Clone the repo: `git clone https://github.com/Dogfalo/materialize.git` (Beta: `git clone -b v1-dev https://github.com/Dogfalo/materialize.git`) 49 | - Include the files via [cdnjs](https://cdnjs.com/libraries/materialize). More [here](http://materializecss.com/getting-started.html). ([Beta](https://cdnjs.com/libraries/materialize/1.0.0-beta)) 50 | - Install with [npm](https://www.npmjs.com): `npm install materialize-css` (Beta: `npm install materialize-css@next`) 51 | - Install with [Bower](https://bower.io): `bower install materialize` ([DEPRECATED](https://bower.io/blog/2017/how-to-migrate-away-from-bower/)) 52 | - Install with [Atmosphere](https://atmospherejs.com): `meteor add materialize:materialize` (Beta: `meteor add materialize:materialize@=1.0.0-beta`) 53 | 54 | ## Documentation 55 | The documentation can be found at . To run the documentation locally on your machine, you need [Node.js](https://nodejs.org/en/) installed on your computer. 56 | 57 | ### Running documentation locally 58 | Run these commands to set up the documentation: 59 | 60 | ```bash 61 | git clone https://github.com/Dogfalo/materialize 62 | cd materialize 63 | npm install 64 | ``` 65 | 66 | Then run `grunt monitor` to compile the documentation. When it finishes, open a new browser window and navigate to `localhost:8000`. We use [BrowserSync](https://www.browsersync.io/) to display the documentation. 67 | 68 | ### Documentation for previous releases 69 | Previous releases and their documentation are available for [download](https://github.com/Dogfalo/materialize/releases). 70 | 71 | ## Supported Browsers: 72 | Materialize is compatible with: 73 | 74 | - Chrome 35+ 75 | - Firefox 31+ 76 | - Safari 9+ 77 | - Opera 78 | - Edge 79 | - IE 11+ 80 | 81 | ## Changelog 82 | For changelogs, check out [the Releases section of materialize](https://github.com/Dogfalo/materialize/releases) or the [CHANGELOG.md](CHANGELOG.md). 83 | 84 | ## Testing 85 | We use Jasmine as our testing framework and we're trying to write a robust test suite for our components. If you want to help, [here's a starting guide on how to write tests in Jasmine](CONTRIBUTING.md#jasmine-testing-guide). 86 | 87 | ## Contributing 88 | Check out the [CONTRIBUTING document](CONTRIBUTING.md) in the root of the repository to learn how you can contribute. You can also browse the [help-wanted](https://github.com/Dogfalo/materialize/labels/help-wanted) tag in our issue tracker to find things to do. 89 | 90 | ## Copyright and license 91 | Code Copyright 2018 Materialize. Code released under the MIT license. 92 | -------------------------------------------------------------------------------- /assets/images/icons/Icon-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-100.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-1024.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-114.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-120.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-128.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-144.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-152.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-16.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-167.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-172.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-180.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-196.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-20.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-256.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-29.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-32.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-40.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-48.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-50.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-512.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-55.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-57.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-58.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-60.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-64.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-72.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-76.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-80.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-87.png -------------------------------------------------------------------------------- /assets/images/icons/Icon-88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/icons/Icon-88.png -------------------------------------------------------------------------------- /assets/images/linkpreview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/assets/images/linkpreview.jpg -------------------------------------------------------------------------------- /assets/js/script.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/DVBHandler.ts","../../src/dataHandler.ts","../../src/distanceHandler.ts","../../src/general.ts","../../src/generators.ts","../../src/geoData.ts","../../src/httpFunctions.ts","../../src/refreshHandler.ts","../../src/searchHandler.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /assets/js/serviceWorkerInstaller.js: -------------------------------------------------------------------------------- 1 | 2 | // /** 3 | // * Installs the service worker if 4 | // */ 5 | // if ('serviceWorker' in navigator) { 6 | // navigator.serviceWorker.register('/service-worker.js') 7 | // .then(function(registration) { 8 | // console.log('Registration successful, scope is:', registration.scope); 9 | // }) 10 | // .catch(function(error) { 11 | // console.log('Service worker registration failed, error:', error); 12 | // }); 13 | // } 14 | -------------------------------------------------------------------------------- /dsgvo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | DVBFast 8 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 19 | 20 | 21 |
22 | Zurück 23 |

Datenschutzerklärung

24 |

Verantwortlicher im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist:

25 |

Lucas Vogel 26 |
web (at) lucas-vogel.de

27 |

Ihre Betroffenenrechte

28 |

Unter den angegebenen Kontaktdaten unseres Datenschutzbeauftragten können Sie jederzeit folgende Rechte ausüben:

29 | 37 |

Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft widerrufen.

38 |

Sie können sich jederzeit mit einer Beschwerde an eine Aufsichtsbehörde wenden, z. B. an die zuständige Aufsichtsbehörde des Bundeslands Ihres Wohnsitzes oder an die für uns als verantwortliche Stelle zuständige Behörde.

39 |

Eine Liste der Aufsichtsbehörden (für den nichtöffentlichen Bereich) mit Anschrift finden Sie unter: https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html.

40 |

Cookies

41 |

Wie viele andere Webseiten verwenden wir auch so genannte „Cookies“. Bei Cookies handelt es sich um kleine Textdateien, die auf Ihrem Endgerät (Laptop, Tablet, Smartphone o.ä.) gespeichert werden, wenn Sie unsere Webseite besuchen.

42 |

Sie können Sie einzelne Cookies oder den gesamten Cookie-Bestand löschen. Darüber hinaus erhalten Sie Informationen und Anleitungen, wie diese Cookies gelöscht oder deren Speicherung vorab blockiert werden können. Je nach Anbieter Ihres Browsers finden Sie die notwendigen Informationen unter den nachfolgenden Links:

43 | 50 |

Speicherdauer und eingesetzte Cookies:

51 |

Soweit Sie uns durch Ihre Browsereinstellungen oder Zustimmung die Verwendung von Cookies erlauben, können folgende Cookies auf unseren Webseiten zum Einsatz kommen:

52 |

Cookies werden ausschließlich als local storage cache verwendet. Diese Daten werden bei erneuten Besuch überschrieben und beinhalten keinerlei personenbezogene Daten.

53 | 54 | 55 | 56 |

Technisch notwendige Cookies

57 |

Art und Zweck der Verarbeitung:

58 |

Wir setzen Cookies ein, um unsere Website nutzerfreundlicher zu gestalten. Einige Elemente unserer Internetseite erfordern es, dass der aufrufende Browser auch nach einem Seitenwechsel identifiziert werden kann.

59 |

Der Zweck der Verwendung technisch notwendiger Cookies ist, die Nutzung von Websites für die Nutzer zu vereinfachen. Einige Funktionen unserer Internetseite können ohne den Einsatz von Cookies nicht angeboten werden. Für diese ist es erforderlich, dass der Browser auch nach einem Seitenwechsel wiedererkannt wird.

60 |

Für folgende Anwendungen benötigen wir Cookies:

61 |

Rechtsgrundlage und berechtigtes Interesse:

62 |

Die Verarbeitung erfolgt gemäß Art. 6 Abs. 1 lit. f DSGVO auf Basis unseres berechtigten Interesses an einer nutzerfreundlichen Gestaltung unserer Website.

63 |

Empfänger:

64 |

Empfänger der Daten sind ggf. technische Dienstleister, die für den Betrieb und die Wartung unserer Website als Auftragsverarbeiter tätig werden.

65 |

Bereitstellung vorgeschrieben oder erforderlich:

66 |

Die Bereitstellung der vorgenannten personenbezogenen Daten ist weder gesetzlich noch vertraglich vorgeschrieben. Ohne diese Daten ist jedoch der Dienst und die Funktionsfähigkeit unserer Website nicht gewährleistet. Zudem können einzelne Dienste und Services nicht verfügbar oder eingeschränkt sein.

67 |

Widerspruch

68 |

Lesen Sie dazu die Informationen über Ihr Widerspruchsrecht nach Art. 21 DSGVO weiter unten.

69 |

SSL-Verschlüsselung

70 |

Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS.

71 |


72 |

Information über Ihr Widerspruchsrecht nach Art. 21 DSGVO

73 |

Einzelfallbezogenes Widerspruchsrecht

74 |

Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen Situation ergeben, jederzeit gegen die Verarbeitung Sie betreffender personenbezogener Daten, die aufgrund Art. 6 Abs. 1 lit. f DSGVO (Datenverarbeitung auf der Grundlage einer Interessenabwägung) erfolgt, Widerspruch einzulegen; dies gilt auch für ein auf diese Bestimmung gestütztes Profiling im Sinne von Art. 4 Nr. 4 DSGVO.

75 |

Legen Sie Widerspruch ein, werden wir Ihre personenbezogenen Daten nicht mehr verarbeiten, es sei denn, wir können zwingende schutzwürdige Gründe für die Verarbeitung nachweisen, die Ihre Interessen, Rechte und Freiheiten überwiegen, oder die Verarbeitung dient der Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.

76 |

Empfänger eines Widerspruchs

77 |

Lucas Vogel 78 |
web (at) lucas-vogel.de

79 |
80 |

Änderung unserer Datenschutzbestimmungen

81 |

Wir behalten uns vor, diese Datenschutzerklärung anzupassen, damit sie stets den aktuellen rechtlichen Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z.B. bei der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung.

82 |

Fragen an den Datenschutzbeauftragten

83 |

Wenn Sie Fragen zum Datenschutz haben, schreiben Sie uns bitte eine E-Mail oder wenden Sie sich direkt an die für den Datenschutz verantwortliche Person in unserer Organisation:

84 |

Die Datenschutzerklärung wurde mithilfe der activeMind AG erstellt, den Experten für externe Datenschutzbeauftragte (Version #2020-09-30).

85 | Zurück 86 |
87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | DVBFast 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 71 | 72 | 76 | 77 | 78 | 111 | 112 | 113 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 153 | 154 | 155 | 156 | 182 | 183 | 184 | 185 | 206 | 207 | 208 | 209 | 210 |
211 |
212 | 213 | 214 |
215 |
216 |
217 |
218 | search 219 | 220 | 221 | 222 |
223 |
224 |
225 |
226 | 227 | 228 | 240 | 241 | 242 |
243 | 244 | 245 | 246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "DVBFast", 3 | "short_name": "DVBFast", 4 | "lang": "de", 5 | "start_url": "/", 6 | "display": "standalone", 7 | "description": "Eine standortbasierte Abfahrtsanzeige.", 8 | "orientation": "portrait", 9 | "theme_color": "#ffc107", 10 | "background_color": "#ffc107", 11 | "icons": [ 12 | { 13 | "src": "assets/images/icons/Icon-72.png", 14 | "sizes": "72x72", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "assets/images/icons/Icon-96.png", 19 | "sizes": "96x96", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "assets/images/icons/Icon-128.png", 24 | "sizes": "128x128", 25 | "type": "image/png" 26 | }, 27 | { 28 | "src": "assets/images/icons/Icon-144.png", 29 | "sizes": "144x144", 30 | "type": "image/png" 31 | }, 32 | { 33 | "src": "assets/images/icons/Icon-152.png", 34 | "sizes": "152x152", 35 | "type": "image/png" 36 | }, 37 | { 38 | "src": "assets/images/icons/Icon-192.png", 39 | "sizes": "192x192", 40 | "type": "image/png" 41 | }, 42 | { 43 | "src": "assets/images/icons/Icon-384.png", 44 | "sizes": "384x384", 45 | "type": "image/png" 46 | }, 47 | { 48 | "src": "assets/images/icons/Icon-512.png", 49 | "sizes": "512x512", 50 | "type": "image/png" 51 | } 52 | ] 53 | } -------------------------------------------------------------------------------- /other/linkpreview.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/other/linkpreview.afdesign -------------------------------------------------------------------------------- /other/logo.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/other/logo.afdesign -------------------------------------------------------------------------------- /other/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasvog/dvbfast/f0d070a3e580a2d8594258238c8a2e9be4a0ca15/other/logo.png -------------------------------------------------------------------------------- /service-worker.js: -------------------------------------------------------------------------------- 1 | // this.addEventListener('install', function(event) { 2 | // event.waitUntil( 3 | // caches.open('v2').then(function(cache) { 4 | // return cache.addAll([ 5 | // '/assets/css/style.css', 6 | // '/assets/js/data.js', 7 | // '/assets/js/script.js', 8 | // '/index.html', 9 | // '/assets/fonts/material-design-icons/font/MaterialIcons-Regular.ttf', 10 | // '/assets/frameworks/materialize/css/materialize.min.css', 11 | // '/assets/frameworks/materialize/js/materialize.min.js', 12 | // ]); 13 | // }) 14 | // ); 15 | // }); 16 | 17 | 18 | // self.addEventListener('fetch', function(event) { 19 | // event.respondWith( 20 | // caches.match(event.request).then(function(response) { 21 | // return response || fetch(event.request); 22 | // }) 23 | // ); 24 | // }); 25 | -------------------------------------------------------------------------------- /src/DVBHandler.ts: -------------------------------------------------------------------------------- 1 | 2 | const departureEndpoint:string = 'https://webapi.vvo-online.de/dm'; 3 | 4 | interface DepartureContainer { 5 | Departures: Departure[], 6 | ExpirationTime: string, 7 | Name: string, 8 | Place: string, 9 | Status: { Code: string }, 10 | 11 | } 12 | /** 13 | * Not a full interface, but the relevant data from each departure 14 | */ 15 | interface Departure { 16 | Direction: string, 17 | LineName: string, 18 | Mot: string, 19 | Platform?: { Name: string, Type: string }, 20 | RealTime: string, 21 | ScheduledTime: string, 22 | State: string 23 | } 24 | 25 | /** 26 | * Finds the next departures from a given station 27 | * @param station an element from the stations json 28 | */ 29 | async function getDeparturesOfStation(station: rawDataStationElement): Promise { 30 | return new Promise(async (resolve, reject) => { 31 | const stationNumber = station.num; 32 | try { 33 | const departures: DepartureContainer = await post(departureEndpoint, { stopid: stationNumber, lim: 5 }) 34 | resolve(departures); 35 | } catch (e) { 36 | showPush("Fehler beim Abfragen der Informationen über eine Station.") 37 | reject(e); 38 | } 39 | 40 | }); 41 | } 42 | -------------------------------------------------------------------------------- /src/dataHandler.ts: -------------------------------------------------------------------------------- 1 | interface dataElement{ 2 | na: string, 3 | num: string, 4 | lat: string, 5 | lon: string, 6 | l: string, 7 | distance?:number 8 | } 9 | 10 | let data:dataElement[] = [] 11 | 12 | /** 13 | * asynchtonously fetches local storage, if necessary, fills and updates it 14 | */ 15 | async function initStationsData(){ 16 | return new Promise(async (resolve,reject)=>{ 17 | let localData:dataElement[] = readStorage("data",true); 18 | if(localData==undefined||localData==null){ 19 | const cacheResult = await asynchronouslyUpdateCache(); 20 | resolve(cacheResult); 21 | return; 22 | }else{ 23 | data = localData; 24 | asynchronouslyUpdateCache(); //without await, processing in the background 25 | resolve(true); 26 | return; 27 | } 28 | }) 29 | } 30 | 31 | 32 | /** 33 | * asynchronously fetches json of stations 34 | */ 35 | async function asynchronouslyUpdateCache() { 36 | return new Promise(async (resolve,reject)=>{ 37 | let thisData:dataElement[] = await get("./assets/data/data.json"); 38 | if(thisData==undefined||thisData==null){ 39 | showPush("Es ist ein Fehler beim Laden der Haltestellen aufgetreten."); 40 | resolve(false); 41 | return; 42 | } 43 | data = thisData; 44 | setStorage("data",thisData,true); 45 | resolve(true); 46 | return; 47 | }) 48 | } 49 | 50 | /** 51 | * sets item to local storage 52 | * @param key key of storage item 53 | * @param value value of storage item 54 | * @param isJSON if value is json, the value will be stringified 55 | */ 56 | function setStorage(key:string,value:any,isJSON=false){ 57 | if(isJSON){ 58 | value = JSON.stringify(value); 59 | } 60 | localStorage.setItem(key, value); 61 | } 62 | 63 | /** 64 | * gets an item from local storage 65 | * @param key key of item 66 | * @param isJSON if value is json, the value will be parsed 67 | */ 68 | function readStorage(key:string,isJSON=false):any{ 69 | try{ 70 | let value = localStorage.getItem(key); 71 | if(isJSON==true){ 72 | value = JSON.parse(value); 73 | } 74 | return value; 75 | }catch(e){ 76 | return null; 77 | } 78 | } -------------------------------------------------------------------------------- /src/distanceHandler.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | /** 4 | * Finds the closest stations to a radius in km 5 | * @param {float} lat1 Latitude in decimal degrees 6 | * @param {float} long1 Longitude in decimal degrees 7 | * @param {number} radius in km to search 8 | */ 9 | function findCloseStations(lat1: number, long1: number, radius = 0.4): rawDataStationElement[] { 10 | let results: rawDataStationElement[] = []; 11 | for (const elementKey in data) { 12 | 13 | let element = data[elementKey]; 14 | const distance = findDistance(lat1, long1, parseFloat(element.lat), parseFloat(element.lon)); 15 | if (distance < radius) { 16 | element.distance = distance; 17 | results.push(element); 18 | } 19 | } 20 | const sortedResults = sortLocationsByDistance(results); 21 | return sortedResults; 22 | } 23 | 24 | 25 | /** 26 | * Sorts an Array of stations by distance 27 | * @param {array} elements Array of station elements. Needs "distance" attribute per object in List 28 | */ 29 | function sortLocationsByDistance(elements: rawDataStationElement[]) { 30 | try { 31 | let returnElements = elements.sort(function (a, b) { return a.distance - b.distance }); 32 | return returnElements; 33 | } catch (e) { 34 | return elements; 35 | } 36 | } 37 | 38 | 39 | const Rk = 6373; // the earths radius in km at ca 39 degrees from the equator. Wikipedia says otherwise. 40 | 41 | /** 42 | * Finds the distance between two points in decimal degree format 43 | * @param {*} latitude1 Latitude of first point 44 | * @param {*} longitude1 Longitude of first point 45 | * @param {*} latitude2 Latitude of second point 46 | * @param {*} longitude2 Longitude of second point 47 | * @returns Distance in KM 48 | */ 49 | function findDistance(latitude1: number, longitude1: number, latitude2: number, longitude2: number) { 50 | // convert coordinates to rad 51 | const lat1 = degree2rad(latitude1); 52 | const lon1 = degree2rad(longitude1); 53 | const lat2 = degree2rad(latitude2); 54 | const lon2 = degree2rad(longitude2); 55 | 56 | // get differences 57 | const dlat = lat2 - lat1; 58 | const dlon = lon2 - lon1; 59 | 60 | //using the Haversine Formula to calculate distances on a round surface. Works well on short distances 61 | let a = Math.pow(Math.sin(dlat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(dlon / 2), 2); 62 | let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // great circle distance in rad 63 | let dk = c * Rk; // great circle distance in km 64 | return dk; 65 | } 66 | 67 | 68 | /** 69 | * convert degrees to radians 70 | * @param deg Degree 71 | * @returns radiant 72 | */ 73 | function degree2rad(deg: number) { 74 | const rad = deg * Math.PI / 180; // radians = degrees * pi/180 75 | return rad; 76 | } 77 | -------------------------------------------------------------------------------- /src/general.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Entry point, inits Materialize CSS and first round of Data 4 | */ 5 | async function init() { 6 | setAutoRefreshSwitchState("off") 7 | //@ts-ignore 8 | M.AutoInit(); 9 | await initStationsData(); 10 | initSearch(); 11 | await initData(); 12 | setAutoRefreshSwitchState("on"); 13 | initialLoad = false; 14 | } 15 | init(); 16 | 17 | //"cache" of close Stations. 18 | let closeStations: rawDataStationElement[] = []; 19 | 20 | /** 21 | * inits all data, by retrieving the closest stations and updating the HTML of the document 22 | */ 23 | async function initData(): Promise { 24 | return new Promise(async (resolve, reject) => { 25 | closeStations = await getCloseStations() 26 | await updateHTMLWithDepartures(); 27 | resolve(true); 28 | }); 29 | } 30 | 31 | /** 32 | * Get the closest Stations. No parameter required. Retrieves the GPS-Data itself by calling getPosition(); 33 | */ 34 | async function getCloseStations(): Promise { 35 | return new Promise(async (resolve, reject) => { 36 | let position: any = null; 37 | try { 38 | position = await getPosition(); 39 | } catch (e) { 40 | console.log(e); 41 | if(e.code==1){ 42 | showPush("Fehler: Berechtigung nicht erteilt. Bitte lassen Sie die Standorterkennung zu, damit Stationen in der Nähe erkannt werden können. ", 10000); 43 | return; 44 | } 45 | if(e.code==2){ 46 | showPush("Fehler: Positionserkennung aktuell nicht verfügbar.", 10000); 47 | return; 48 | } 49 | if(e.code!==3){ 50 | showPush("Fehler: "+e.code, 5000); 51 | } 52 | 53 | return; 54 | } 55 | if (position == null) { 56 | showPush("Standort kann nicht bestimmt werden."); 57 | return; 58 | } 59 | const closeStations: rawDataStationElement[] = findCloseStations(position.coords.latitude, position.coords.longitude); 60 | //const closeStations:rawDataStationElement[] = findCloseStations(51.053533, 13.816152); //Seilbahnen testen 61 | //const closeStations:rawDataStationElement[] = findCloseStations(51.039867, 13.733739); Hauptbahnhof 62 | if (closeStations == undefined || closeStations == null) { 63 | showPush("Stationen in der konntent nicht gefunden werden."); 64 | return; 65 | } 66 | if (closeStations.length <= 0) { 67 | showPush("Keine Stationen in dem Radius gefunden."); 68 | return; 69 | } 70 | resolve(closeStations); 71 | }); 72 | } 73 | 74 | /** 75 | * Updates the HTML with the departures boxes 76 | */ 77 | async function updateHTMLWithDepartures() { 78 | return new Promise(async (resolve, reject) => { 79 | let html = ""; 80 | for (const station of closeStations) { 81 | const departures = await getDeparturesOfStation(station); 82 | if (departures == undefined || departures == null) { 83 | showPush("Fehler beim Laden der nächsten Verbindungen."); 84 | resolve(false); 85 | return; 86 | } 87 | html += generateBox(station, departures); 88 | 89 | } 90 | let target = document.getElementById("boxcontainer"); 91 | if (target == null) { 92 | showPush("Interner Fehler."); 93 | resolve(false); 94 | return; 95 | } 96 | target.innerHTML = html; 97 | resolve(true); 98 | }); 99 | } 100 | 101 | /** 102 | * Shows a notofication 103 | * @param message Message to display as push notification 104 | */ 105 | function showPush(message: string, displayLength = 4000) { 106 | //@ts-ignore 107 | M.toast({ html: message, displayLength: displayLength }) 108 | } -------------------------------------------------------------------------------- /src/generators.ts: -------------------------------------------------------------------------------- 1 | const departureLimit:number = 6; 2 | 3 | /** 4 | * Generates the HTML for a station including the departures 5 | * @param station station for the box 6 | * @param departuresContainer departure-element from the VVO API 7 | * @param isSearchResult if this is a search result, some data will be shown different 8 | * @returns HTML 9 | */ 10 | function generateBox(station: rawDataStationElement, departuresContainer: DepartureContainer,isSearchResult=false): string { 11 | const title = generateTitleHTML(station,isSearchResult); 12 | let departuresHTML = ""; 13 | let departures = departuresContainer.Departures; 14 | let thisDepartureLimit = 0; 15 | let moreDeparturesHTML =""; 16 | console.log(departuresContainer); 17 | if(departures===undefined){ 18 | return ""; 19 | } 20 | for (const departure of departures) { 21 | if (thisDepartureLimit < departureLimit) { 22 | departuresHTML += generateDepartureHTML(departure); 23 | }else{ 24 | moreDeparturesHTML+=generateDepartureHTML(departure); 25 | } 26 | thisDepartureLimit += 1; 27 | } 28 | let html = ` 29 |
30 |
31 | ${title} 32 | ${departuresHTML} 33 |
34 |
` 35 | return html; 36 | } 37 | 38 | 39 | /** 40 | * Generates the title HTML of a station 41 | * @param station station to generate html from 42 | * @param isSearchResult if this is a search result 43 | * @returns html 44 | */ 45 | function generateTitleHTML(station: rawDataStationElement,isSearchResult=false) { 46 | const title = station.na; 47 | const distance = generateDistanceString(station.distance) || "unbekannt"; 48 | 49 | let html = ` 50 |
51 |
52 |
53 |
location_on${title}
` 54 | if(isSearchResult==false){ 55 | html+=`Distanz: ${distance}` ; 56 | } 57 | html+=`
58 |
59 |
`; 60 | return html; 61 | } 62 | 63 | 64 | const departureMinutesCutoffPointInMinutes =90; 65 | /** 66 | * Generates all departures as HTML 67 | * @param departure departure-element from the VVO API 68 | * @returns html 69 | */ 70 | function generateDepartureHTML(departure: Departure): string { 71 | const lineNumber = departure.LineName; 72 | const target = departure.Direction; 73 | const unparsedTimeStamp = departure.RealTime || departure.ScheduledTime; 74 | const time = generateClockTimeStringFromUnparsedUTCTimestamp(unparsedTimeStamp); 75 | const timeDifference = calculateRemainingTimeInMinutes(departure); 76 | 77 | let steig = ""; 78 | const iconClass = calculateLineClassName(departure); 79 | try { 80 | steig = "Steig " + departure.Platform.Name; 81 | } catch (e) { 82 | steig = "" 83 | } 84 | let departureStatus = calculateDepartureStatus(departure); 85 | if(departureStatus===undefined||departureStatus==="undefined"){ 86 | departureStatus = "Unbekannter Zustand"; 87 | } 88 | 89 | let timeDifferenceString = ""; 90 | if(timeDifference>0){ 91 | if(timeDifference 104 |
105 |
106 |
107 | ${lineNumber} 108 |
109 |
110 |
111 |
${target}
112 | ${steig} 113 |
114 |
115 |
${timeDifferenceString}
116 | ${departureStatus} 117 |
118 |
119 | 120 | `; 121 | return html 122 | } 123 | 124 | /** 125 | * Generates a class name from the mode of transport (MOT) 126 | * @param departure departure-Element from the VVO-API 127 | * @returns class-name 128 | */ 129 | function calculateLineClassName(departure: Departure): string { 130 | let returnClassValue = "bus"; 131 | if (departure.Mot == undefined || departure.Mot == null || departure.Mot == "") { 132 | return returnClassValue; 133 | } 134 | const mot = departure.Mot; 135 | 136 | switch (mot) { 137 | case "Fähre": 138 | returnClassValue = "faehre"; 139 | break; 140 | case "Ferry": 141 | returnClassValue = "faehre"; 142 | break; 143 | case "S-Bahn": 144 | returnClassValue = "sbahn"; 145 | break; 146 | case "SuburbanRailway": 147 | returnClassValue = "sbahn"; 148 | break; 149 | 150 | case "Seil-/Schwebebahn": 151 | returnClassValue = "schwebebahn"; 152 | break; 153 | case "Cableway": 154 | returnClassValue = "schwebebahn"; 155 | break; 156 | case "Straßenbahn": 157 | returnClassValue = "strassenbahn"; 158 | break; 159 | case "Tram": 160 | returnClassValue = "strassenbahn"; 161 | break; 162 | case "Zug": 163 | returnClassValue = "zug"; 164 | break; 165 | case "Train": 166 | returnClassValue = "zug"; 167 | break; 168 | case "HailedSharedTaxi": 169 | returnClassValue = "taxi"; 170 | break; 171 | } 172 | return returnClassValue; 173 | } 174 | 175 | /** 176 | * Calculates if the departure is on time, otherwise display the delay and sheduled plan 177 | * @param departure departure-Element from the VVO-API 178 | */ 179 | function calculateDepartureStatus(departure: Departure) { 180 | const onTime = 'check_circle '; //pünktlich 181 | 182 | const delayStart = 'warning'; 183 | const delayEnd = "" 184 | const toEarlyStart = 'warning'; 185 | const unit = " min."; 186 | const clockTime =" Uhr"; 187 | const sheduledIconDelayed = 'wysiwygy' 188 | const canceledHTML = 'cancelFällt aus' 189 | const realTime = generateUTCStringFromUnparsedTimestamp(departure.RealTime || departure.ScheduledTime); 190 | 191 | const scheduledTime = generateUTCStringFromUnparsedTimestamp(departure.ScheduledTime); 192 | const sheduledTimeString = generateHoursAndMinutesFromUtcDateString(scheduledTime); 193 | let unknown = ""; 194 | try{ 195 | unknown = generateClockTimeStringFromUnparsedUTCTimestamp(departure.RealTime || departure.ScheduledTime); 196 | }catch(e){ 197 | return ""; 198 | } 199 | if (departure.State == undefined) { 200 | return unknown+clockTime; 201 | } 202 | if (departure.State === "InTime") { 203 | return onTime +" "+sheduledTimeString+clockTime; 204 | } 205 | if(departure.State === "Cancelled"){ 206 | return canceledHTML; 207 | } 208 | 209 | 210 | if (realTime == null || scheduledTime == null) { 211 | return unknown; 212 | } 213 | if (realTime !== scheduledTime) { 214 | let timeDifference = realTime - scheduledTime; 215 | let minutes = generateMinutesFromMilliseconds(timeDifference); 216 | if (timeDifference > 0) {//later 217 | return delayStart + "+" + Math.abs(minutes).toString() + " " + sheduledIconDelayed + sheduledTimeString + clockTime + delayEnd; 218 | } else {//earlier 219 | return toEarlyStart + "+" + Math.abs(minutes).toString() + " " + sheduledIconDelayed + sheduledTimeString + clockTime + delayEnd; 220 | } 221 | 222 | } 223 | } 224 | 225 | /** 226 | * Converts milliseconds to minutes 227 | * @param milliseconds milliseconds to calculate from 228 | */ 229 | function generateMinutesFromMilliseconds(milliseconds: number | string): number { 230 | if (typeof milliseconds == "string") { 231 | milliseconds = parseInt(milliseconds); 232 | } 233 | const minutes = milliseconds / 1000 / 60; 234 | return minutes; 235 | } 236 | 237 | /** 238 | * Generates a time string in Form 00:00 from a VVO API endpoint Date 239 | * @param unparsedTimestamp string from the VVO API like /Date(1604085840000-0000)/ 240 | * @returns timestring onf form 00:00 or XX:XX 241 | */ 242 | function generateClockTimeStringFromUnparsedUTCTimestamp(unparsedTimestamp: string): string { 243 | if (unparsedTimestamp == undefined || unparsedTimestamp == null || unparsedTimestamp === "") { 244 | return "XX:XX" 245 | } 246 | const dvbDate = generateUTCStringFromUnparsedTimestamp(unparsedTimestamp); 247 | if (dvbDate == null) { 248 | return "XX:XX" 249 | } 250 | return generateHoursAndMinutesFromUtcDateString(dvbDate); 251 | 252 | } 253 | 254 | /** 255 | * Generates a Time String in Form 00:00 from a utc timestamp 256 | * @param date a number in utc time format 257 | * @returns timestring onf form 00:00 or XX:XX 258 | */ 259 | function generateHoursAndMinutesFromUtcDateString(date: number): string { 260 | try { 261 | let thisDate = new Date(date); 262 | let returnString = ""; 263 | returnString += ('0' + thisDate.getHours()).substr(-2); 264 | returnString += ":" 265 | returnString += ('0' + thisDate.getMinutes()).substr(-2); 266 | return returnString; 267 | } catch (e) { 268 | return "XX:XX" 269 | } 270 | } 271 | 272 | 273 | /** 274 | * Generates a utc timestamp 275 | * @param utcString String of unparsed DVB-String format, like /Date(1604085840000-0000)/ 276 | */ 277 | function generateUTCStringFromUnparsedTimestamp(utcString: string): number | null { 278 | const dvbDateRegex = /\/Date\((\d+)-\d*\)\//g; 279 | const dateMatch = dvbDateRegex.exec(utcString); 280 | if (dateMatch == null || dateMatch.length != 2) { 281 | return null; 282 | } 283 | const returnValue = dateMatch[1] 284 | return parseInt(returnValue); 285 | } 286 | 287 | /** 288 | * Generates a short string describing the distance in km or m 289 | * @param distance in non-rounded km format 290 | */ 291 | function generateDistanceString(distance: number): string { 292 | try { 293 | if (distance > 1) { 294 | const roundedDistanceString = (Math.round(distance * 100) / 100).toString().substr(0, 4); 295 | return roundedDistanceString + "km"; 296 | } else { 297 | const roundedDistanceString = (Math.round(distance * 1000)).toString(); 298 | 299 | return roundedDistanceString + "m"; 300 | } 301 | 302 | } catch (e) { 303 | return "" 304 | } 305 | } 306 | 307 | /** 308 | * Calculates remaining time in minutes from now to a departure 309 | * @param departure delarture to calculate from 310 | */ 311 | function calculateRemainingTimeInMinutes(departure:Departure):number{ 312 | var now = Date.now(); 313 | var departureTime = generateUTCStringFromUnparsedTimestamp(departure.RealTime || departure.ScheduledTime); 314 | var difference = departureTime-now; 315 | var returnValue = Math.floor(difference/1000/60)-1;//the one minute is the last minute where the train is rolling in 316 | if(returnValue<0){ 317 | return 0; 318 | } 319 | return returnValue; 320 | } -------------------------------------------------------------------------------- /src/geoData.ts: -------------------------------------------------------------------------------- 1 | interface rawDataStationElement { 2 | na: string, 3 | num: string, 4 | lat: string, 5 | lon: string, 6 | l: string, 7 | distance?: number 8 | } 9 | /** 10 | * Options for geolocation-API 11 | */ 12 | const options = { 13 | enableHighAccuracy: true, 14 | timeout: 5000, 15 | maximumAge: 0 16 | }; 17 | 18 | /** 19 | * Talks to the geolocation-API and returns it 20 | * @returns Promise that returns to a geolocation-object 21 | */ 22 | async function getPosition():Promise { 23 | return new Promise((resolve, reject) => { 24 | let timeout = setTimeout(() => { 25 | reject({code:3,message:"timeout"}); 26 | return; 27 | }, 30000)//after X seconds: timeout 28 | try{ 29 | navigator.geolocation.getCurrentPosition(async (pos: any) => { 30 | clearTimeout(timeout); 31 | resolve(pos); 32 | return; 33 | }, 34 | (error) => { 35 | clearTimeout(timeout); 36 | reject(error); 37 | return; 38 | }, options); 39 | }catch(e){ 40 | console.log(e); 41 | } 42 | }); 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/httpFunctions.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * POST data to an http endpoint 4 | * @param url url to post to 5 | * @param data in object format 6 | * @returns Data in JSON format 7 | */ 8 | async function post(url = '', data = {}) { 9 | try{ 10 | const response = await fetch(url, { 11 | method: 'POST', 12 | mode: 'cors', 13 | headers: { 14 | 'Content-Type': 'application/json' 15 | }, 16 | redirect: 'follow', 17 | referrerPolicy: 'no-referrer', 18 | body: JSON.stringify(data) 19 | }); 20 | return response.json(); 21 | }catch(e){ 22 | return null; 23 | } 24 | } 25 | 26 | /** 27 | * HTTP GET method 28 | * @param {String} url url of the request 29 | * @returns promise that resolves to the result of the request, otherwise null. 30 | */ 31 | async function get(url:string):Promise { 32 | return new Promise(function (resolve, reject) { 33 | try { 34 | fetch(url, { 35 | method: "GET", 36 | }) 37 | .then(response => { 38 | //console.log(response); 39 | if (response.status == 200) { 40 | let contentType = response.headers.get("content-type"); 41 | if (contentType && contentType.indexOf("application/json") !== -1) { 42 | return response.json() 43 | } else { 44 | resolve(null); 45 | } 46 | } else { 47 | resolve(null); 48 | } 49 | }) 50 | .then(json => resolve(json)); 51 | } catch (e) { 52 | resolve(null); 53 | } 54 | }); 55 | } -------------------------------------------------------------------------------- /src/refreshHandler.ts: -------------------------------------------------------------------------------- 1 | 2 | const intervallTimeInSeconds:number = 20; //time in seconds for the auto-refresh 3 | 4 | let isDisabled:boolean = false; 5 | let isCurrentlyLoading:boolean = false; 6 | let currentRefreshState:number = 0; 7 | let initialLoad:boolean = true;//initial loading of the website 8 | 9 | let lastRefeshTime:number = Date.now(); 10 | 11 | 12 | /** 13 | * This intervall checks, if the last update is more than intervallTimeInSeconds ago. 14 | * This is neccessary, because if the website is in the background, phones pause the JavaScript 15 | * After re-opening the website, the infos should be immediately refreshed. 16 | */ 17 | let lastRefreshIntervall = setInterval(()=>{ 18 | const now = Date.now(); 19 | const difference = now-lastRefeshTime; 20 | if(lastRefeshTime!==0&&difference>intervallTimeInSeconds*1500){ 21 | lastRefeshTime = now; 22 | currentRefreshState = 0; 23 | refreshInfos(); 24 | } 25 | },300); 26 | 27 | /** 28 | * Intervall that handles the progress of the auto refresh. 29 | */ 30 | let refreshIntervall = setInterval(() => { 31 | if (getIfAutorefreshIsEnabled() == false) { 32 | isDisabled = true; 33 | } else { 34 | isDisabled = false; 35 | } 36 | if (currentRefreshState > intervallTimeInSeconds || isCurrentlyLoading == true || isDisabled == true||initialLoad==true) { 37 | currentRefreshState = 0; 38 | } else { 39 | currentRefreshState += 1; 40 | } 41 | const progress = currentRefreshState / intervallTimeInSeconds; 42 | if (progress >= 1) { 43 | currentRefreshState = 0; 44 | refreshInfos(); 45 | updateSearchResult();//in searchHandler.ts 46 | } 47 | updateRefreshButtonProgress(progress); 48 | }, 1000) 49 | 50 | 51 | /** 52 | * returns the switch state of auto refresh 53 | */ 54 | function getIfAutorefreshIsEnabled() { 55 | let disabledButton: any = document.getElementById("autorefreshSwitch"); 56 | return disabledButton.checked; 57 | } 58 | 59 | /** 60 | * calling this function results in a renewal of the displayed data. 61 | */ 62 | async function refreshInfos() { 63 | if (isCurrentlyLoading == true) { 64 | return; 65 | } 66 | let thisTimeout = setTimeout(() => { 67 | isCurrentlyLoading = false; 68 | }, 120000);//two minutes 69 | isCurrentlyLoading = true; 70 | setSpinnerState("on"); 71 | await initData(); 72 | setSpinnerState("off"); 73 | lastRefeshTime = Date.now(); 74 | clearTimeout(thisTimeout); 75 | isCurrentlyLoading = false; 76 | } 77 | 78 | /** 79 | * Sets the state of the icon in the refresh-button 80 | * @param state state of the spinner 81 | */ 82 | function setSpinnerState(state: "on" | "off") { 83 | let spinner = document.getElementById("refreshSpinner"); 84 | if (state == "on") { 85 | spinner.classList.add("spinning"); 86 | } else { 87 | spinner.classList.remove("spinning"); 88 | } 89 | } 90 | 91 | /** 92 | * Sets the state of the switch that toggles the auto refresh 93 | * @param state state of the switch 94 | */ 95 | function setAutoRefreshSwitchState(state:"on"|"off"){ 96 | let thisSwitch:any = document.getElementById("autorefreshSwitch"); 97 | if(state=="on"){ 98 | thisSwitch.checked =true; 99 | }else{ 100 | thisSwitch.checked = false; 101 | } 102 | } 103 | 104 | /** 105 | * Updates the gradient on the refresh button 106 | * @param progress in a range from 0 to 1 107 | */ 108 | function updateRefreshButtonProgress(progress: number) { 109 | let refreshbutton = document.getElementById("refreshButton"); 110 | if (progress >= 1 || progress <= 0) { 111 | refreshbutton.setAttribute("style", ""); 112 | } else { 113 | const progressCSS = generateProgressGradientString(progress); 114 | refreshbutton.setAttribute("style", progressCSS); 115 | } 116 | } 117 | 118 | /** 119 | * Generates a gradient from left to right that displays a progress 120 | * @param progress in a range from 0 to 1 121 | */ 122 | function generateProgressGradientString(progress: number) { 123 | const progressInPercent = progress * 100; 124 | let html = `background: linear-gradient(90deg, #ff8f00 0%, #f57c00 ${progressInPercent}%, #ff8f00 ${progressInPercent}%);`; 125 | return html; 126 | } -------------------------------------------------------------------------------- /src/searchHandler.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The last result of the search. Is used to refresh result 3 | */ 4 | let lastResultStation:rawDataStationElement|null = null; 5 | 6 | /** 7 | * Initializes the search bar 8 | */ 9 | function initSearch(){ 10 | lastResultStation = null; 11 | const elems = document.querySelectorAll('.autocomplete'); 12 | let optionsData:any = {}; 13 | for (const element of data){ 14 | const key = element.l+" "+element.na; 15 | optionsData[key] = null; 16 | } 17 | //@ts-ignore 18 | const instances = M.Autocomplete.init(elems, { 19 | data: optionsData, 20 | minLength:2, 21 | onAutocomplete:handleResult, 22 | sortFunction : sortResultFunction 23 | }); 24 | } 25 | /** 26 | * Sorts Elements and prefers results from dresden 27 | * @param a array of autocomplete-elements 28 | * @param b array of autocomplete-elements 29 | * @param inputString text string to compare 30 | */ 31 | function sortResultFunction(a:string,b:string,inputString:string){ 32 | let extra = 0; 33 | if(!inputString.startsWith("D")){ 34 | return 0; 35 | } 36 | return (a.indexOf(inputString) - b.indexOf(inputString))+extra; 37 | } 38 | 39 | /** 40 | * Gets called, if the search bar is autocompleted 41 | * @param query text of the search bar 42 | */ 43 | async function handleResult(query:string){ 44 | console.log(query); 45 | 46 | let result:rawDataStationElement|null = matchTitleWithStation(query); 47 | if(result==null){ 48 | showPush("Station konnte nicht gefunden werden."); 49 | return; 50 | } 51 | lastResultStation = result; 52 | updateSearchResult(); 53 | 54 | } 55 | 56 | /** 57 | * Will be called in refreshHandler 58 | */ 59 | async function updateSearchResult() { 60 | if(lastResultStation==null){ 61 | return; 62 | } 63 | const departures = await getDeparturesOfStation(lastResultStation); 64 | if (departures == undefined || departures == null) { 65 | showPush("Fehler beim Laden der nächsten Verbindungen."); 66 | return; 67 | } 68 | const html = generateBox(lastResultStation, departures,true); 69 | setSearchContainerVisibility("visible"); 70 | setResultContainerHTML(html); 71 | 72 | } 73 | /** 74 | * Matches the autocompleted string with a station 75 | * @param title title of the station to search for 76 | */ 77 | function matchTitleWithStation(title:string):rawDataStationElement|null{ 78 | for(const element of data){ 79 | const key = element.l+" "+element.na; 80 | if(key===title){ 81 | return element; 82 | } 83 | } 84 | showPush("Station wurde nicht gefunden."); 85 | return null; 86 | } 87 | 88 | /** 89 | * Closes the search result box 90 | */ 91 | function closeResult(){ 92 | lastResultStation = null; 93 | setSearchContainerVisibility("hidden"); 94 | setResultContainerHTML(""); 95 | } 96 | 97 | /** 98 | * Sets the html of the result container box 99 | * @param html string to be set 100 | */ 101 | function setResultContainerHTML(html:string){ 102 | let resultBox =document.getElementById("searchResult"); 103 | resultBox.innerHTML=html; 104 | } 105 | 106 | /** 107 | * Sets the visibility of the search result container 108 | * @param status to be set 109 | */ 110 | function setSearchContainerVisibility(status:"visible"|"hidden"){ 111 | let searchContainer = document.getElementById("searchResultContainer"); 112 | if(status==="visible"){ 113 | searchContainer.classList.remove("hidden"); 114 | } else{ 115 | searchContainer.classList.add("hidden"); 116 | } 117 | } 118 | 119 | /** 120 | * Checks if the search bar is emty 121 | */ 122 | function updateClearButtonVisibility(){ 123 | var searchValue = getSearchBarValue(); 124 | if(searchValue!==""){ 125 | setClearStatus("visible"); 126 | }else{ 127 | setClearStatus("hidden"); 128 | } 129 | } 130 | 131 | /** 132 | * Sets the status of the clear searchbar button 133 | * @param status status of the button 134 | */ 135 | function setClearStatus (status:"hidden"|"visible"){ 136 | var clearButton = document.getElementById("clearSearchButton"); 137 | if(status=="hidden"){ 138 | clearButton.classList.add("hidden"); 139 | }else{ 140 | clearButton.classList.remove("hidden"); 141 | } 142 | } 143 | 144 | /** 145 | * Gets the contents of the search bar 146 | */ 147 | function getSearchBarValue():string{ 148 | var searchbar:any = document.getElementById("autocomplete-input"); 149 | return searchbar.value; 150 | } 151 | 152 | /** 153 | * Clears the search bar 154 | */ 155 | function clearSearchBar(){ 156 | var searchbar:any = document.getElementById("autocomplete-input"); 157 | searchbar.value=""; 158 | setClearStatus("hidden"); 159 | } -------------------------------------------------------------------------------- /tools/simpleconverter.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Falls Sie nicht wissen, was sie hier tun sollen, sollten Sie die Seite verlassen.

10 |

Dieses Schript sucht alle IDs aller Haltestellen des VVO.

11 |

Die entstandenen Daten sind unter https://github.com/lucasvog/dvbfast bei assets > data einsehbar.

12 |

Das Ausführen dieses Scriptes produziert lediglich diese Daten.

13 | 14 |

15 | 16 |

17 | 18 | 19 | 20 |

21 | 24 | 25 | 26 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /tools/stationsNumberLokup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Suche nach der VVO-Information einer Station.

10 |

Dieses Schript stellt die Informationen einer Suche nach einer Haltestelle des VVO dar.

11 |

Die zu vergleichenden Daten sind unter https://github.com/lucasvog/dvbfast bei assets > data einsehbar.

12 | 13 |

14 | 15 |

16 | 17 | 18 | 19 |

20 |
21 | 
22 |     
23 | 24 | 25 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "system", 4 | "noImplicitAny": true, 5 | "removeComments": true, 6 | "outFile": "./assets/js/script.js", 7 | "sourceMap": true, 8 | "lib": [ "ES2015","DOM" ] 9 | }, 10 | "include": ["src/**/*"], 11 | "exclude": ["node_modules", "**/*.spec.ts"] 12 | } --------------------------------------------------------------------------------